消息队列优缺点以及各个产品对比

2022-05-13 10:04:57 浏览数 (2)

一简介

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

二 各种消息中间件的对比

使用较多的消息队列有: ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ 处理速度:kafka>rabbbitmq>activemq 安全性: activemq>rabbitmq>kafka

三 使用消息队列之后有什么缺点?

系统可用性降低:系统引入的外部依赖越多,越容易挂掉,本来你就是A系统调用BCD三个系统的接口就好了,人ABCD四个系统好好的,没啥问题,你偏加个MQ进来,万一MQ挂了整套系统崩溃了。

系统复杂性提高:硬生生加个MQ进来,你怎么保证消息没有重复消费?怎么处理消息丢失的情况?怎么保证消息传递的顺序性?

一致性问题:若ACBD系统均处理完返回系统成功,用消息队列后,A系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,要是BCD三个系统那里,BD两个系统写库成功了,结果C系统写库失败了,咋整?你这数据就不一致了。

所以消息队列实际是一种非常复杂的架构,你引入它有很多好处,但是也得针对它带来的坏处做各种额外的技术方案和架构来规避掉.你会发现可能最后系统复杂度提升了一个数量级,也许是复杂了10倍。但是关键时刻,用,还是得用的。。。

image

详细的还可以看: 开源软件成熟度评测报告-分布式消息中间件

RabbitMQ 选型和对比

1.从社区活跃度

按照目前网络上的资料,RabbitMQactiveMZeroMQ 三者中,综合来看,RabbitMQ 是首选。

2.持久化消息比较

ZeroMq 不支持,ActiveMqRabbitMq 都支持。持久化消息主要是指我们机器在不可抗力因素等情况下挂掉了,消息不会丢失的机制。

3.综合技术实现

可靠性、灵活的路由、集群、事务、高可用的队列、消息排序、问题追踪、可视化管理工具、插件系统等等。

RabbitMq / Kafka 最好,ActiveMq 次之,ZeroMq 最差。当然ZeroMq 也可以做到,不过自己必须手动写代码实现,代码量不小。尤其是可靠性中的:持久性、投递确认、发布者证实和高可用性。

4.高并发

毋庸置疑,RabbitMQ 最高,原因是它的实现语言是天生具备高并发高可用的erlang 语言。

5.比较关注的比较, RabbitMQ 和 Kafka

RabbitMqKafka 成熟,在可用性上,稳定性上,可靠性上, RabbitMq 胜于 Kafka (理论上)。

另外,Kafka 的定位主要在日志等方面, 因为Kafka 设计的初衷就是处理日志的,可以看做是一个日志(消息)系统一个重要组件,针对性很强,所以 如果业务方面还是建议选择 RabbitMq

还有就是,Kafka 的性能(吞吐量、TPS )比RabbitMq 要高出来很多。

6.我这边用的是rabbitmq,所以这里说一下我用RabbitMQ的原因
  • 1.语言无关,什么语言都可以,对我们这边很多使用不同语言开发的项目比较友好,大家都可以用
  • 2.低时延,并发能力高,他是基于erlang语言开发,erlang内部对多线程做了很多优化,然后他对操作系统的调度优化基本相当于实现了自己的进程管理一样. 进程非常轻量,短时间能快速创建和销毁,并且切换代价小;Erlang 进程间通讯使用消息,而不是多线程编程中常用的锁机制,没有等待锁的时间消耗。
  • 3.管理界面比较好看,功能强大
  • 4.最主要的是文档比较完善,我们之前团队一直用的都是这个RabbitMQ

0 人点赞