二、RabbitMQ 快速使用 - MQ 简介

作者: 温新

分类: 【PHP RabbitMQ】

阅读: 1289

时间: 2023-02-27 07:10:56

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,数据量相对小;

业务层面:根据使用规模可以在 RocketMQkafka 之间进行选择:

  • 大型业务系统:业务量大、数据量足够大时,此时 RocketMQ 和 kafka 都在考虑范围之内。kafka 偏向于大数据处理,如日志采集等,此时首选 kafka。

参考资料

究竟什么时候该使用 MQ:https://zhuanlan.zhihu.com/p/141230803

MQ系列:消息中间件执行原理:https://heapdump.cn/article/3618495

请登录后再评论