2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

中小型研发团队架构实践:如何用好消息队列 RabbitMQ?

  • 2017-11-30
  • 本文字数:2255 字

    阅读完需:约 7 分钟

一、写在前面

使用过分布式中间件的人都知道,程序员使用起来并不复杂,常用的客户端 API 就那么几个,比我们日常编写程序时用到的 API 要少得多。但是分布式中间件在中小研发团队中使用得并不多,为什么会这样呢?

原因是中间件的职责相对单一,客户端的使用虽然简单,但整个环境搭起来却不容易。所以对于系列中的几篇中间件文章,我们重点放在解决门槛问题,把服务端环境搭好(后期可云或运维解决),把中间件的基本职责和功能介绍好,把客户端 Demo 写好,让程序员抬抬脚,在调试代码中即可轻松入门。

根据我们以往几年的经验,初次接触也可以自主快速学习,文章和 Demo 以实用为主,以下是消息队列 RabbitMQ 的快速入门及应用。

二、为什么要用消息队列 MQ

1、业务系统往往要求响应能力特别强,能够起到削峰填谷的作用。

2、解耦:如果一个系统挂了,则不会影响另外个系统的继续运行。

3、业务系统往往有对消息的高可靠要求,以及有对复杂功能如 Ack 的要求。

4、增强业务系统的异步处理能力,减少甚至几乎不可能出现并发现象:

使用消息队列,就好比为了防汛而建葛洲坝,有大量数据的堆积能力,然后可靠地进行异步输出。例如:

传统做法存在如下问题,请见上图:

  1. 一旦业务处理时间超过了定时器时间间隔,就会导致漏单。
  2. 如果采用新开线程的方式获取数据,那么由于大量新开线程处理,会容易造成服务器宕机。
  3. 数据库压力大,易并发。

使用 MQ 后的好处,请见上图

  1. 业务可注册、可配置。
  2. 获取数据规则可配置。
  3. 成功消费 MQ 中的消息才会被 Ack,提高可靠性。
  4. 大大增强了异步处理业务作业的能力:

定时从数据库获取数据后,存入 MQ 消息队列,然后 Job 会定期扫描 MQ 消息队列,假设 Job 扫描后先预取 5 条消息,然后异步处理这 5 条消息,也就是说这 5 条消息可能会同时被处理。

三、RabbitMQ 简介

RabbitMQ 是基于 AMQP 实现的一个开源消息组件,主要用于在分布式系统中存储转发消息,由因高性能、高可用以及高扩展而出名的 Erlang 语言写成。

其中,AMQP(Advanced Message Queuing Protocol,即高级消息队列协议),是一个异步消息传递所使用的应用层协议规范,为面向消息的中间件设计。

RabbitMQ 特点如下:

高可靠:RabbitMQ 提供了多种多样的特性让你在可靠性和性能之间做出权衡,包括持久化、发送应答、发布确认以及高可用性。

高可用队列:支持跨机器集群,支持队列安全镜像备份,消息的生产者与消费者不论哪一方出现问题,均不会影响消息的正常发出与接收。

灵活的路由:所有的消息都会通过路由器转发到各个消息队列中,RabbitMQ 内建了几个常用的路由器,并且可以通过路由器的组合以及自定义路由器插件来完成复杂的路由功能。

支持多客户端:对主流开发语言(如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等)都有客户端实现。

集群:本地网络内的多个 Server 可以聚合在一起,共同组成一个逻辑上的 broker。

扩展性:支持负载均衡,动态增减服务器简单方便。

权限管理:灵活的用户角色权限管理,Virtual Host 是权限控制的最小粒度。

插件系统:支持各种丰富的插件扩展,同时也支持自定义插件,其中最常用的插件是 Web 管理工具 RabbitMQ_Management,其 Web UI 访问地址:

http://139.198.13.12:6233/

登录账号:flight,密码:yyabc123。

四、RabbitMQ 工作原理

消息从发送端到接收端的流转过程即 RabbitMQ 的消息工作机制,请见下图:

消息发送与接收的工作机制

五、RabbitMQ 基本用法

共有 6 种基本用法:单对单、单对多、发布订阅模式、按路由规则发送接收、主题、RPC(即远程存储调用)。我们将介绍单对单、单对多和主题的用法。

1、单对单:单发送、单接收。请见下图。

2、单对多:一个发送端,多个接收端,如分布式的任务派发。请见下图:

3、主题:Exchange Type 为 topic,发送消息时需要指定交换机及 Routing Key,消费者的消息队列绑定到该交换机并匹配到 Routing Key 实现消息的订阅,订阅后则可接收消息。只有消费者将队列绑定到该交换机且指定的 Routing Key 符合匹配规则,才能收到消息。

其中 Routing Key 可以设置成通配符,如:* 或 #(* 表示匹配 Routing Key 中的某个单词,# 表示任意的 Routing Key 的消息都能被收到)。如果 Routing Key 由多个单词组成,则单词之间用. 来分隔。

命名规范:

交换机名的命名建议:Ex{AppID}.{自定义 ExchangeName},队列名的命名建议:MQ{AppID}.{自定义 QueueName} 。

六、Demo 下载及更多资料

RabbitMQDemo 下载地址 https://github.com/das2017/RabbitMQDemo

RabbitMQ 的官方网址 http://www.rabbitmq.com

本系列文章涉及内容清单如下(并不按这顺序发布),其中有感兴趣的,欢迎关注:

作者介绍

张辉清,10 多年的 IT 老兵,先后担任携程架构师、古大集团首席架构、中青易游 CTO 等职务,主导过两家公司的技术架构升级改造工作。现关注架构与工程效率,技术与业务的匹配与融合,技术价值与创新。

杨丽,拥有多年互联网应用系统研发经验,曾就职于古大集团,现任职中青易游系统架构师,主要负责公司研发中心业务系统的架构设计以及新技术积累和培训。现阶段主要关注开源软件、软件架构、微服务以及大数据。

感谢雨多田光对本文的审校。

2017-11-30 16:4930783

评论

发布
暂无评论
发现更多内容

在线XML转HTML工具

入门小站

工具

netty系列之:channel和channelGroup

程序那些事

Java Netty 程序那些事 1月日更

网络安全kali渗透学习 web渗透入门 Kali系统的被动信息收集

学神来啦

技术干货 | NeCodeGen:基于 clang 的源到源转译工具

网易云信

前端 Clang

研效优化实践:WeTest提效测试

WeTest

【实时渲染】3DCAT实时渲染云在BIM领域的应用

3DCAT实时渲染

云计算 渲染 BIM 建筑

手把手教你学Dapr - 5. 状态管理

MASA技术团队

C# .net 微软 微服务 dapr

跟着源码学IM(十):基于Netty,搭建高性能IM集群(含技术思路+源码)

JackJiang

Netty 即时通讯 IM im架构设计

详解 HDFS 底层交互原理

五分钟学大数据

hdfs 1月月更

老牌安全厂商海泰方圆加入龙蜥社区

OpenAnolis小助手

Linux 开源 社群运营

爆测一周!22年必看最细致代码托管工具测评

阿里云云效

阿里云 云原生 代码管理 代码托管 Codeup

深入浅出Apache Pulsar(2):Pulsar消息机制

云智慧AIOps社区

视频智能生产及内容分析应用工具开源了!​

百度大脑

人工智能

架构训练营 week5 课程总结

红莲疾风

「架构实战营」

SPARK 应用如何快速应对 LOG4J 的系列安全漏洞

明哥的IT随笔

spark CDH

线程的生命周期,真的没那么简单

华为云开发者联盟

Java 线程 生命周期 编程语言线程

PK体系“配齐”!亚信科技数据库与麒麟软件OS、飞腾CPU完成产品适配

亚信AntDB数据库

AntDB 亚信科技

从 ClickHouse 到 ByteHouse:实时数据分析场景下的优化实践

字节跳动数据平台

数据库 字节跳动 Clickhouse 实时数据分析 bytehouse

Committer 郭吉伟专访:做开源不是搞慈善,用开源也不是薅羊毛

Apache Pulsar

开源 架构 云原生 中间件 Apache Pulsar

大数据开发之Flink SQL建设实时数仓实践

@零度

大数据 flink sql

【云成本】降低云成本三大技巧你知道吗?

行云管家

云计算 企业上云 云成本

操作指南|最详尽文档翻译志愿指南

Apache Pulsar

开源 翻译 云原生 Apache Pulsar 社区

APP违法使用个人信息?不用怕,华为云VSS为你保驾护航

华为云开发者联盟

移动应用 安全 漏洞 隐私合规 华为云VSS漏洞扫描服务

gpushare.com_基于去噪Transformer的无监督句子编码【EMNLP 2021】

恒源云

深度学习 语音识别 transform

博文推荐|基于 Apache Pulsar 的分布式锁

Apache Pulsar

开源 分布式 云原生 中间件 Apache Pulsar

【行业云说】云数底座赋能基层治理现代化

云计算运维

手把手教你学Dapr - 4. 服务调用

MASA技术团队

C# .net 微软 微服务 dapr

Flume日志采集框架构成组件

编程江湖

flume

基于 PTS 压测轻松玩转问题诊断

阿里巴巴云原生

阿里云 云原生 压测 问题 PTS

一文看懂:工程项目管理软件有哪些?怎么选?

优秀

项目管理软件

易用好用的云管平台看这里!行云管家杠杠的!

行云管家

云计算 企业上云 混合云 云管平台

中小型研发团队架构实践:如何用好消息队列RabbitMQ?_语言 & 开发_张辉清_InfoQ精选文章