下面图,是在自己理解的基础上,对官方的模型图添加了一些。
对于 MQ 解决的问题做总结。
通过电商平台用户注册送积分、送优惠券这个场景来理解异步解耦合。如果不使用消息中间件,电商平台送积分的实现也许是下图这个样子:
由上图可知,这个 设计
有一个比较严重的问题,那就是可扩展性低。
如,如果调整活动策略,在发送积分的同时,还需要发送额外的大礼包,就不得不修改用户注册流程,并重新部署用户注册模块。
从功能来看,需求的变更集中在活动相关的内容。用户注册本身的逻辑并未发生变化,但由于用户注册逻辑与活动模块存在耦合,两个模块必须一起调整和发布。
另外,调用积分、优惠两个功能,也会增加用户注册流程时间变长,在高并发场景下,用户注册易变成系统瓶颈。
将注册逻辑与积分、优惠业务分离,这样,注册逻辑就不会因为积分、优惠业务的变化,而修改,即使添加了新的大礼包,优惠、积分的业务,后续也不再变化,做到了真正对新增开放,对修改关闭。
一般从业务出发,选择合适的 MQ ,如果是从普适性出发,可根据功能、单机吞吐、水平扩展上进行选择,还可以根据公司或团队的技术栈来选择 MQ ,如果公司语言以 Erlang ,那可以选择 RabbitMQ ,性能可以通过更多的集群来解决。如果是以 Java 为主,建议使用 Kafka,或者 RocketMQ。两者都是性能优秀的中间件,在这两者之间选择时,可以更多关注功能特性。
特别是 RocketMQ 提供了消息重试、消息过滤、消息轨迹、消息检索等功能特性,特别是 RocketMQ 的消息检索功能,因此很适合核心业务场景。而 Kafka 更加擅长于日志、大数据计算、流式计算等场景。
如下是常见的 MQ 做的相关对比。
维度 | 对比项 | Kafka | RocketMQ | RabbitMQ |
---|---|---|---|---|
功能维度 | 延迟消息 | 不支持 | 支持 | 支持 |
功能维度 | 优先级队列 | 不支持 | 不支持 | 支持 |
功能维度 | 事务消息 | 支持 | 支持 | 支持 |
功能维度 | 消息重试 | 不支持 | 支持 | 不支持 |
功能维度 | 消息堆积能力 | 强 | 强 | 弱(性能会受影响) |
功能维度 | 消息回溯 | 支持 | 支持 | 不支持 |
功能维度 | 消息过滤 | 不支持 | 支持 | 不支持 |
功能维度 | 消息轨迹 | 不支持 | 支持 | 支持(需要插件) |
功能维度 | 多语言 | 支持多语言客户端 | 支持多语言客户端 | 支持多语言客户端 |
功能维度 | ACL | 支持 | 支持 | 支持 |
性能维度 | 单机吞吐量 | 百万级 | 十万级 | 万级 |
性能维度 | 消息发送时延 | ms级 | us级 | us级 |
性能维度 | 水平伸缩能力 | 支持(伴随大量数据复制) | 支持(轻量级) | 支持 |
其它维度 | 技术栈 | Java/Scala | Java | Erlang |
RocketMQ 总体概括至引结束,如有疑问,欢迎评论区留言。