西南IT社区
    • 注册
    • 登录
    • 搜索
    • 主页
    • 问答
    • 话题
    • 热门
    • 圈子
    • 工作机会
    • 活动
    • 项目

    实现将同步变成异步

    技术答疑
    同步变成异步
    1
    1
    12
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 爱
      爱的天地 最后由 编辑

        任何软件问题都可以通过添加一层中间层来解决,如果不能,那就再加一层,同样的针对以上问题我们也可以添加一个中间层来解决,比如添加个队列,把用户注册这个事件放到队列中,让其他模块去这个队列里取这个事件然后再做相应的操作。
      062cdcde-41af-4a9f-9521-823ecad67156-image.png
        可以看到,这是个典型的生产者-消费者模型,用户注册后只要把注册事件丢给这个队列就可以立即返回,实现了将同步变了异步,其他服务只要从这个队列中拉取事件消费即可进行后续的操作,同时也实现了注册用户逻辑与其他服务的解耦。

        另外即使流量暴增也没有影响,因为注册用户将事件发给队列后马上返回了,这一发消息可能只要 5 ms,也就是说总耗时是 50ms+5ms = 55 ms,而原来的总耗时是 200 ms,系统的吞吐量和响应速度提升了近 4 倍,大大提升了系统的负责能力,这一步也就是我们常说的削峰,将暴增的流量放入队列中以实现平稳过渡,加了一层队列就达到了异步,解藕,削峰的目的。

        由于队列在生产者所在服务内存,其他消费者不得不从生产者中取,也就意味着生产者与消息者紧藕合,这显然不合理。

        消息丢失:现在是把消息存储在队列中,而队列是在内存中的,那如果机器宕机,队列中的消息不就丢失了吗,显然不可接受。

        单个队列中的消息只能被一个服务消费,也就是说如果某个服务从队列中取消息消费后,其他服务就取不了这个消息了,有一个办法倒是可以,为每一个服务准备一个队列,这样发送消息的时候只发送给一个队列,再通过这个队列把完整消息复制给其他队列即可。
      4593e9bb-f3dc-41d0-956f-5a2584016764-image.png

      1 条回复 最后回复 回复 引用 0
      • First post
        Last post
      使用HTML构建办公软件 使用HTML构建办公软件 使用HTML构建办公软件
      爱
      F
      漫
      成
      Y
      洋
      书
      Y
      D
      U
      Y
      娇
      玩
      1
      光
      A
      庆
      小
      U
      Y
      L
      I
      Z
      I
      Y

      西南地区IT社群(QQ)
      云南
      【昆明网页设计交流吧】243627302
      【昆明nodejs交流吧】 243626749
      【VUE】838405306
      【云南程序员总群】343606807
      【昆明UI设计】104031254
      【云南软件外包】15547313
      贵州
      【PHP/java源码/站长交流群】55692114
      四川
      【成都Java/JavaWeb交流】86669225
      【vaScript+PHP+MySql】116270060
      【UI设计/设计交流学习群】135794928
      重庆
      【诺基亚 JAVA游戏博物馆】 559479780
      【PHP,Java,Python,C++接单】 442103442
      西藏
      社群
      昆明网页设计交流吧
      友情链接
      • Funtask
      • Funtask 社区
      • SUWIS
      ©2019-2021 滇ICP备20006698号