Go知识库MQ消息系列

消息中间件的一些思考

2018-12-12  本文已影响55人  千淘萬漉
1.为什么使用消息队列?

核心说起来就是:解耦、异步、削峰。

2.消息队列的不足?
3.各种消息中间件的对比与选型
特性 ActiveMQ RabbitMQ RocketMQ Kafka
单机吞吐量 万级,吞吐量比RocketMQ和Kafka要低了一个数量级 万级,吞吐量比RocketMQ和Kafka要低了一个数量级 10万级,RocketMQ也是可以支撑高吞吐的一种MQ 10万级别,这是kafka最大的优点,就是吞吐量高。一般配合大数据类的系统来进行实时数据计算、日志采集等场景
topic数量对吞吐量的影响 topic可以达到几百,几千个的级别,吞吐量会有较小幅度的下降。RocketMQ的一大优势,在同等机器下,可以支撑大量的topic topic从几十个到几百个的时候,吞吐量会大幅度下降。所以在同等机器下,kafka尽量保证topic数量不要过多。如果要支撑大规模topic,需要增加更多的机器资源
时效性 ms级 微秒级,这是rabbitmq的一大特点,延迟是最低的 ms级 延迟在ms级以内
可用性 高,基于主从架构实现高可用性 高,基于主从架构实现高可用性 非常高,分布式架构 非常高,kafka是分布式的,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用
消息可靠性 有较低的概率丢失数据 经过参数优化配置,可以做到0丢失 经过参数优化配置,消息可以做到0丢失
功能支持 MQ领域的功能极其完备 基于erlang开发,所以并发能力很强,性能极其好,延时很低 MQ功能较为完善,还是分布式的,扩展性好 功能较为简单,主要支持简单的MQ功能,在大数据领域的实时计算以及日志采集被大规模使用,是事实上的标准

总结:

4.如何保证消息不被重复消费啊(设计消息消费时的幂等性)?

需要结合具体的业务来看,重启系统重启应用等突发事件发生时可能会无可避免的产生MQ的消息重复推送,这个时候要保证消息消费时,重复的数据在DB里面只有一条:

5.如何保证消息的可靠性传输(如何处理消息丢失的问题)?

这个地方针对不同的消息中间件有不同的确认机制,以RabbitMQ为例,其一般承担的是非常核心的业务数据,必须保证数据不能丢失,从消息链路的每个环节都必须保证可靠性:消息发送,RabbitMQ自身还有消息接收三个环节。消息发送时的事务+确认机制,RabbitMQ持久化机制,还有消费端的手动Ack模式。具体可以参阅:《深入浅出RabbitMQ》

6.如何保证消息的顺序性?

会错乱的场景和对应的解决方案:

7.消息的高可用

RabbitMQ方面采用的是镜像队列的来保证服务的高可用,基于主从架构。引入RabbitMQ的镜像队列机制,将queue镜像到cluster中其他的节点之上。在该实现下,如果集群中的一个节点失效了,queue能自动地切换到镜像中的另一个节点以保证服务的可用性。在通常的用法中,针对每一个镜像队列都包含一个master和多个slave,分别对应于不同的节点。slave会准确地按照master执行命令的顺序进行命令执行,故slave与master上维护的状态应该是相同的。——可参考《深入浅出RabbitMQ》

8.消息堆积的处理方案
9.如果让你写一个消息队列,该如何进行架构设计啊?
上一篇 下一篇

猜你喜欢

热点阅读