知识点:消息解耦、Kafka、RabbitMQ、消费模式、幂等性处理
消息队列在现代分布式系统中扮演中间件角色,实现异步解耦、削峰填谷与消息驱动。通过引入MQ组件,可将复杂的服务调用拆分成异步消息交互,降低耦合性与系统压力。
Kafka是高吞吐量的消息队列,适合日志、行为数据等流式处理场景。其分区机制与顺序消费能力,适合构建实时数据平台。RabbitMQ则提供更丰富的路由与确认机制,适合订单、通知等业务型消息处理。
消息消费模式分为点对点与发布订阅。点对点模式每条消息仅被一个消费者处理;而发布订阅则支持多订阅者共享消息副本,适用于广播型通知。
幂等性是MQ消费的重要保障,避免重复消费引发的数据库污染与业务异常。可通过唯一ID、幂等表、Token机制等方式实现消费幂等控制。
为确保消息可靠性,还需关注消息确认(ACK)、失败重试、死信队列等机制,构建稳定可靠的消息系统。
消息队列选择建议
1.Kafka
Kafka主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输,适合产生大量数据的互联网服务的数据收集业务。
大型公司建议可以选用,如果有日志采集功能,肯定是首选kafka了。
如果是大数据领域的实时计算、日志采集等场景,用 Kafka 是业内标准的,绝对没问题,社区活跃度很高,绝对不会黄,何况几乎是全世界这个领域的事实性规范。
2.RocketMQ
天生为金融互联网领域而生,对于可靠性要求很高的场景,尤其是电商里面的订单扣款,以及业务削峰,在大量交易涌入时,后端可能无法及时处理的情况。
RoketMQ在稳定性上可能更值得信赖,这些业务场景在阿里双11已经经历了多次考验,如果你的业务有上述并发场景,建议可以选择RocketMQ。
不过现在确实越来越多的公司,会去用 RocketMQ,确实很不错(阿里出品),但社区可能有突然黄掉的风险,对自己公司技术实力有绝对自信的,推荐用 RocketMQ,否则回去老老实实用 RabbitMQ 吧,人家有活跃的开源社区,绝对不会黄。
3.RabbitMQ
RabbitMQ :结合erlang语言本身的并发优势,性能较好,社区活跃度也比较高,但是不利于做二次开发和维护。不过,RabbitMQ的社区十分活跃,可以解决开发过程中遇到的bug。
如果你的数据量没有那么大,小公司优先选择功能比较完备的RabbitMQ。
所以中小型公司,技术实力较为一般,技术挑战不是特别高,用 RabbitMQ 是不错的选择;大型公司,基础架构研发实力较强,用 RocketMQ 是很好的选择。