中间件核心技术与实战
丁威
中通快递资深架构师,RocketMQ 社区首席布道师
19674 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 33 讲
中间件核心技术与实战
15
15
1.0x
00:00/00:00
登录|注册

13 | 技术选型:如何根据应用场景选择合适的消息中间件?

你好,我是丁威。
随着微服务技术的兴起,消息中间件也成为了分布式架构体系的必备组件,所以从这节课开始,我们一起来学习消息中间件。
我们的课程还是会将理论和实践相结合,将重点落在实战。
我会分别介绍消息中间件的应用场景与技术选型、两种消息中间件(Kafka 和 RocketMQ)分别是如何实现高性能的。紧接着,我会结合自己的工作经验,带你看看消息中间件如何实现蓝绿发布、如何提升 RocketMQ 顺序消费能力;最后,我们会一起认识消息中间件优雅的生产环境运维能力,搞清如何排查消息发送、消息消费相关的故障。
我们这节课主要来看消息中间件应用场景与技术选型。

消息中间件的应用场景

消息中间件的应用场景主要有两个:异步解耦与削峰填谷。
我们首先通过电商平台用户注册送积分、送优惠券这个场景来理解异步解耦合。如果不使用消息中间件,电商平台送积分的实现也许是下图这个样子:
我们简单看一下这个流程。
用户在网站前端注册页面填写相关信息,然后调用账号中心服务,注册账号。
账户中心首先执行用户注册逻辑处理(例如判断用户是否已注册、是否符合注册条件等),然后写入到数据库。
注册成功后,需要调用积分中心(赠送积分接口)给用户送积分。
送完积分后,再调用优惠券相关接口,为用户赠送优惠券。
成功送完积分、优惠券后,向用户返回“注册成功”。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

选择合适的消息中间件对于应用场景至关重要。本文通过电商平台用户注册送积分、送优惠券的场景,以及外卖骑手送餐的案例,深入探讨了消息中间件在异步解耦和削峰填谷方面的重要性。文章还对RocketMQ、Kafka和RabbitMQ等主要消息中间件进行了功能和性能方面的对比分析,强调了在选型时需要综合考虑功能特性、性能和扩展性,以及团队技术栈与中间件编程语言的匹配度。此外,文章提出了在实际选型时的建议,如根据团队的技术栈选择合适的消息中间件。总的来说,本文通过实际案例和技术对比,为读者提供了在选择和应用消息中间件时的参考指南。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《中间件核心技术与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(7)

  • 最新
  • 精选
  • 浅qian的痕迹
    带来的问题和解决办法: 1. 系统可用性会降低 比如:MQ挂掉了 解决方案:MQ集群部署,提高可用性 2、系统复杂性提高 加入MQ,需要考虑消息重复消费、保证消息不丢失、保证消息有序等问题 数据丢失解决方案: 生产端丢失:设置MQ给生产者合理的ACK方式 MQ服务端的数据丢失:比如同步刷盘,牺牲部分性能 消费端数据丢失:同步消费,不在多线程里面消费 3、一致性问题 下游服务消费消息异常,可能导致上下游服务里的数据不一致 解决办法: 可以重复消费,错误报警,对账或者手动修复

    作者回复: 你好,思考的非常全面,我尝试对你的这些思考,做一个补充说明: 1、引入了MQ,整个系统就多增加了一项外部依赖,出现问题的几率确实会增大,通常的解决方案确实如你所说,MQ需要使用集群部署。 2、第二点,这里我觉得你思考的比较全面,但措施可能有些悲观,我在这里谈谈我的一些观点: 1)消息发送端,设置合理的ack,这个是正确的,通常采取的措施一般类似两阶段提交思想,通过引入半消息,本地消息表来实现消息发送的分布式最终一致性,这块内容在第22讲有重点提及。 2)MQ服务端数据丢失,采取同步刷盘,这样会降低性能,资源的利用率会升高,通常我们会进行权衡,一般而言,只要数据容易恢复,容易进行补偿,通常还是可以使用异步刷盘。关于消费端消息丢失,消息中间件基本都是采取最小位点提交机制(ack),可以确保在消费端不会丢消息,最多就是会重复消费。 3、一致性问题,通常会使用类似分布式事务机制,例如本地消息表等手段,这块在第22讲有专门介绍,当然对账或手动修复,也是需要的。

    2022-07-20归属地:上海
    8
  • fireshort
    “如果公司或团队的技术栈以 Golang 为主,建议选择 RabbitMQ”?这里搞错了,RabbitMQ用的是Erlang。

    作者回复: 对的,笔误,谢谢指正,已修改。

    2022-11-15归属地:广东
    1
  • Y a n g
    带来的问题 数据一致性问题,如果用户注册和发mq消息都在账号中心同一方法内处理,那么很难保证数据的一致性。举例 用户注册写库时未提交数据库事务失败,此时mq消息已发出,再或者下游消费异常,导致数据不一致 解决方法:做分布式事务

    作者回复: 嗯,对的,如何来做分布式事务,我在我们专栏的第22讲专门介绍了,建议关注一下,多多交流。

    2022-07-28归属地:上海
    1
  • 雨落~紫竹
    第一 kafka 被称为分布式实时流计算平台 他比其他mq 应该很适合处理这种低延迟的场景 第二 kafka说 丢消息不是它的问题 这锅它不背 第三 确保端到端的稳定和消费 确保不会因为服务导致重启(对于强需求而言 消费端必须手动ack )第四 随着系统增多 复杂性增高 有必要增加链路追踪服务 将每一步的消息或者重要逻辑处理结果放到追踪服务 方便排查问题
    2022-07-18
    3
  • 雨落~紫竹
    还有 老师 你上面那个流程图 我实在想不出来 为什么 开始就做成异步了 结果又出来两个rpc 无论是在技术上还是业务上
    2022-07-18
    1
  • Sudouble
    从用户角度看:当消息中间件中的处理发生了延迟的情况下,而用户注册后又要立马查看积分信息时,会出现不可用/信息异常的情况。
    2023-05-17归属地:北京
  • 芋头
    1.可用性 引入的初衷就包含削峰填谷、解耦整体上提升系统可用性,如果这个环节脆弱也会降低可用性,解决方案:集群及持久化措施 2.复杂性:如何确保消息不丢失、顺序消费、不重复消费都是需要考虑的问题 解决方案:不重复消费可以通过业务幂等性来保证 3.一致性:由于消费存在延迟,如何解决不一致性?待学习
    2023-03-26归属地:广东
    1
收起评论
显示
设置
留言
7
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部