二、RabbitMQ 快速使用 - MQ 简介
hi,我是温新,一名 PHPer
版本:erlang-25.2.1、rabbitmq_server-3.11.9
系统版本:Rocky Linux 9.1
学习目标:了解什么是 MQ 及选型
本篇文章结合官方文档编写及参考网络资料编写,虽非全部原创,但也是结合了自己的理解,若转载请附带本文 URL,编写不易,持续编写更不易,谢谢!
Rabbitmq 已经跑起来,趁热打铁,学习 MQ 相关的基础知识。
什么是 MQ
**MQ(Message Queue)一般指消息队列,它是一种应用程序对应用程序之间进行消息通信的中间件产品。**一端只需要不断的队列中发送消息,另一端只需要不断的从队列中读取消息。发送消息的人不关心读者是谁,读取消息的人不关心发布者是谁,彼此互不干扰。
MQ 的优劣
MQ 的优势:
- 应用解耦 - 提高系统之间的容错性和可维护性。
- 异步提速 - 提升用户体验和系统吞吐量。
- 削峰填谷 - 提供系统稳定性。
MQ 的劣势:
- 降低系统可用性 - 系统引入外部依赖越多,系统稳定性越差。一旦 MQ 宕机,直接业务造成影响。
- 提高系统复杂度 - MQ 的加入加大了系统的复杂度,如一致性问题、消息不被重复消费问题、消息可靠性传输等。
- 一致性问题 - A 系统处理业务完成,通过 MQ 给 B、C、D 三个系统发送数据,假设 B、C 处理完成,D 处理失败,怎么保持数据一致问题?
为什么使用 MQ
在使用 MQ 的场景中,它拥有 应用解耦
、流量削峰
、异步处理
、有序性
、消息路由
的能力。
什么时候使用 MQ
- 1、上游不关心下游执行结果;
- 2、上游关心下游执行结果,但执行时间很长;
- 3、数据库驱动的人物依赖。
什么时候不使用 MQ
上游实时关注执行结果,通常常用 RPC。
主流 MQ 对比
特性 | RabbitMQ | RocketMQ | kafka |
---|---|---|---|
开发语言 | erlang | java | scala |
支持协议 | AMQP,XMPP,SMTP,STOMP | 自定义 | 基于 TCP 自定义 |
客户端支持 | 支持 Erlang、PHP、Java、Ruby 等 | Java,C++ | Java、PHP、Python 等 |
消息存储能力 | 内衬、磁盘支。持少量堆积 | 磁盘。支持大量堆积 | 内存、磁盘、数据库。支持大量堆积 |
消息事务性 | 支持(信道设置事务模式,性能有影响) | 支持 | 支持 |
单机吞吐量 | 万级 | 10万级+ | 10万级+ |
时效性 | 微妙级 | 毫秒级 | 毫秒级以内 |
消息重复 | 支持at least once、at most once | 支持at least once | 支持at least once、at most once |
消息回溯 | 不支持 | 支持指定时间点的回溯 | 支持指定分区offset位置的回溯 |
消息重试 | 不支持,但可以设置autoACK=false,未收到确认的会重入队列 | 支持 | 不支持,但可以通过消息回溯的方式来实现 |
可用性 | 高(主从架构) | 非常高(分布式架构) | 非常高(分布式架构) |
功能特性 | 基于erlang开发,所以并发能力很强,性能极其好,延时很低 | MQ 功能比较完备,扩展性佳 | 只支持主要的 MQ 功能,在大数据领域应用广 |
MQ 选型
不够全面,只进行的简单的切入,仅作参考。
**系统方面:**中小型系统可以选择用 RabbitMQ
,数据量相对小;
业务层面:根据使用规模可以在 RocketMQ
和 kafka
之间进行选择:
- 大型业务系统:业务量大、数据量足够大时,此时 RocketMQ 和 kafka 都在考虑范围之内。kafka 偏向于大数据处理,如日志采集等,此时首选 kafka。
参考资料
究竟什么时候该使用 MQ:https://zhuanlan.zhihu.com/p/141230803
MQ系列:消息中间件执行原理:https://heapdump.cn/article/3618495
请登录后再评论