<返回更多

常用消息队列框架与技术选型

2023-11-13  今日头条  
加入收藏

又是一年双11季,土豪们买买买,程序员看看热闹,聊聊技术。海量的订单、支付请求以及库存更新等任务,离不开分布式架构(SOFAStack)、分布式数据库(OceanBase)、分布式缓存(TAIr)、数据处理(Flink)等一系列框架的支持。而消息队列作为连接这些组件的重要纽带,可以实现各组件之间的异步通信和解耦。本文接下来就聊聊消息队列那些事儿~

消息队列给我们带来什么?

消息中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削峰等问题,实现高性能,高可用,可伸缩和最终一致性的系统架构。

在分布式系统中,服务之间可能会有依赖关系,如果直接进行服务调用,会增加服务之间的耦合度。使用消息队列可以将服务之间的通信转化为消息的发送和接收,降低服务之间的耦合度。

常用消息队列框架与技术选型

降低系统耦合性(源于网络)

在高并发场景下,瞬间的请求量可能会超出系统的承受能力,导致系统瘫痪。使用消息队列可以实现流量削峰,将请求放入消息队列中,由消费者服务异步消费请求,有效降低瞬间的请求量,保护系统稳定性。

常用消息队列框架与技术选型

削峰/限流(源于网络)

在分布式系统中,不同服务之间的调用可能会因为网络延迟或者服务负载高等原因导致调用时间较长。使用消息队列可以实现异步处理,将请求放入消息队列中,由消费者服务异步消费请求,提高系统的并发性和吞吐量。

常用消息队列框架与技术选型

异步提高性能(源于网络)

常用的消息队列框架?

目前在市面上比较主流的消息队列中间件主要有,Kafka、ActiveMQ、RabbitMQ、RocketMQ 等这几种。

常用消息队列框架与技术选型

RocketMQ和Kafka 都是高吞吐量、高可用的分布式消息队列系统,相较于早期较活跃的ActiveMQ 和RabbitMQ 还是有着明显优势的,特别是在双11这样的场景,吞吐量的重要性是不言而喻的。

接下来从多个维度重点对RocketMQ与Kafka对比:

数据可靠性

在同步复制方面,RocketMQ可以利用IO组的commit机制,批量传输数据,因此性能上可能比Kafka要更好一些。而Kafka的同步复制是以partition为单位进行的,一个Kafka实例上可能有多个partition,这可能会影响性能。

单机支持的队列数

队列多有什么好处呢?

单机可以创建更多个topic, 因为每个topic都是有一组队列组成。

消费者的集群规模和队列数成正比,队列越多,消费类集群可以越大。

消息投递的实时性

push模式是基于pull模式的,本地有个定时线程去pull broker的消息,缓存到本地,然后push到消费线程。

消费失败重试

这里的重试指可靠的重试,即失败重试的消息不是因为consumer宕机而导致的消息丢失。

严格保证消息有序

定时消息

分布式事务消息

消息查询

消息回溯

RocketMQ按时间做回溯消息的典型应用场景为,consumer做订单分析,但是由于程序逻辑或依赖的系统发生故障等原因,导致今天处理的消息全部无效,需要从昨天的零点重新处理。

消息并行度

消息队列如何选型?

消息队列常见问题

如何避免重复消费?如何保证幂等性?

幂等性:就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用问题

我们先来了解一下产生消息重复消费的原因,对于MQ的使用,有三个角色:生产者、MQ、消费者,那么消息的重复这三者会出现:

如何解决呢?在正常情况下,生产者是客户,我们很难避免出现用户重复点击的情况,而MQ是允许存在多条一样的消息,但消费者是不允许出现消费两条一样的数据,所以幂等性一般是在消费端实现的:

如何解决消息丢失?

消息丢失属于比较常见的问题。一般有生产端丢失、MQ服务丢失、消费端丢失等三种情况。针对各种情况应对方式也不一样。

生产端丢失的解决方案主要有。

MQ服务丢失则主要是开启消息持久化,让消息及时保存到磁盘。

消费端消息丢失则关闭自动ack确认,消息消费成功后手动发送ack确认。消息消费失败,则重新消费。

(3)如何保证消息有序性

在生产端发布消息时,每次法发布消息都把上一条消息的ID记录到消息体中,消费者接收到消息时,做如下操作:

(4) 如何解决消息积压问题?

所谓的消息积压,即生成者生成消息太快,而消费者处理消息太慢,从而导致消费端消息积压在MQ中无法处理的问题。遇到这种消息积压的情况,可以根据消息重要程度,分为两种情况处理:

常用消息队列框架与技术选型

PS:实际项目中是否需要使用消息队列以及如何使用,还是要根据业务特点进行选择,一个UV没几个的系统,使用消息队列,则纯粹是老板掏钱、研发受罪了。

关键词:框架      点击(14)
声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多框架相关>>>