原文:中小研发团队架构实践之RabbitMQ快速入门及应用

使用过分布式中间件的人都知道,程序员使用起来并不复杂,常用的客户端API就那么几个,比我们日常编写程序时用到的API要少得多。但是分布式中间件在中小研发团队中使用得并不多,为什么会这样呢?原因是中间件的职责相对单一,客户端的使用虽然简单,但整个环境搭起来却不容易。所以对于中间件的使用,我们重点放在解决门槛问题,把服务端环境搭好(生产环境可直接使用云或运维解决),把中间件的基本职责和功能介绍好,把客户端Demo写好,让程序员抬抬脚,在调试代码中即可轻松入门。根据我们以往几年的经验,初次接触也可以自主快速学习。文章和Demo以实用为主,能用代码说明的就不用文字,以下是消息队列RabbitMQ的快速入门及应用。

一、为什么要用消息队列

1.1 使用消息队列的好处

  1. 业务系统往往要求响应能力特别强,能够起到削峰填谷的作用。
  1. 解耦和高可用。如果一个系统挂了,则不会影响另外个系统的继续运行。
  1. 业务系统往往有对消息的高可靠要求,以及有对复杂功能如Ack的要求。
  1. 增强业务系统的异步处理能力,减少甚至几乎不可能出现并发现象。

1.2 案例说明

使用消息队列就好比为了防汛而建葛洲坝,有大量数据的堆积能力,然后可靠地进行异步输出。以下是我们业务案例的传统做法,存在如下问题:

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

基于以上问题,我们使用消息队列RabbitMQ改进了系统。先定时从数据库获取数据,然后存入MQ消息队列,最后Job定期扫描MQ消息队列进行处理,改进后好处如下:

  1. 业务可注册、可配置。
  1. 获取数据规则可配置。
  1. 成功消费MQ中的消息才会被Ack,提高可靠性。
  1. 大大增强了异步处理业务作业的能力,假设Job扫描后先预取5条消息,然后异步处理这5条消息,也就是说这5条消息可能会同时被处理。

二、RabbitMQ简介

RabbitMQ是基于AMQP实现的一个开源消息组件,主要用于在分布式系统中存储转发消息,由因高性能、高可用以及高扩展而出名的 Erlang 语言写成。其中,AMQP(Advanced Message Queuing Protocol,即高级消息队列协议),是一个异步消息传递所使用的应用层协议规范,为面向消息的中间件设计。RabbitMQ特点如下:

  • 高可靠:RabbitMQ 提供了多种多样的特性让你在可靠性和性能之间做出权衡,包括持久化、发送应答、发布确认以及高可用性。
  • 高可用队列:支持跨机器集群,支持队列安全镜像备份,消息的生产者与消费者不论哪一方出现问题,均不会影响消息的正常发出与接收。
  • 灵活的路由:所有的消息都会通过路由器转发到各个消息队列中,RabbitMQ内建了几个常用的路由器,并且可以通过路由器的组合以及自定义路由器插件来完成复杂的路由功能。
  • 支持多客户端:对主流开发语言(如:Python、Ruby、C#、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(即远程存储调用)。我们将介绍单对单、单对多和主题的用法。

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

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

  • 主题:Exchange Type为topic。

发送消息时需要指定交换机及Routing Key,消费者的消息队列绑定到该交换机并匹配到Routing Key实现消息的订阅,订阅后则可接收消息。只有消费者将队列绑定到该交换机且指定的Routing Key符合匹配规则,才能收到消息。其中Routing Key可以设置成通配符,如:*或#(*表示匹配Routing Key中的某个单词,#表示任意的Routing Key的消息都能被收到)。如果Routing Key由多个单词组成,则单词之间用.来分隔。

  • 命名规范:

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

五、Demo下载及更多资料

中小研发团队架构实践之RabbitMQ快速入门及应用的更多相关文章

  1. 中小型研发团队架构实践:Redis快速入门及应用

    Redis的使用难吗?不难,Redis用好容易吗?不容易.Redis的使用虽然不难,但与业务结合的应用场景特别多.特别紧,用好并不容易.我们希望通过一篇文章及Demo,即可轻松.快速入门并学会应用. ...

  2. 中小型研发团队架构实践:分布式协调服务ZooKeeper

    一.ZooKeeper 是什么 Apache ZooKeeper 由 Apache Hadoop 的子项目发展而来,于 2010 年 11 月正式成为了 Apache 的顶级项目. 相关厂商内容 优秀 ...

  3. 中小型研发团队架构实践:任务调度Job

    一.Job 简介 Job 类似于数据库中的作业,多用于实现定时执行任务.适用场景主要包括定时轮询数据库同步.定时处理数据.定时邮件通知等. 我们的 Job 分为操作系统级别定时任务 WinJob 和 ...

  4. 中小研发团队架构实践之生产环境诊断工具WinDbg 三分钟学会.NET微服务之Polly 使用.Net Core+IView+Vue集成上传图片功能 Fiddler原理~知多少? ABP框架(asp.net core 2.X+Vue)模板项目学习之路(一) C#程序中设置全局代理(Global Proxy) WCF 4.0 使用说明 如何在IIS上发布,并能正常访问

    中小研发团队架构实践之生产环境诊断工具WinDbg 生产环境偶尔会出现一些异常问题,WinDbg或GDB是解决此类问题的利器.调试工具WinDbg如同医生的听诊器,是系统生病时做问题诊断的逆向分析工具 ...

  5. 中小研发团队架构实践之分布式协调器.Net版ZooKeeper

    原文:中小研发团队架构实践之分布式协调器.Net版ZooKeeper 一.ZooKeeper是什么  Apache ZooKeeper是由Apache Hadoop的子项目发展而来,于2010年11月 ...

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

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

  7. 中小型研发团队架构实践五:Redis快速入门及应用

    Redis的使用难吗?不难,Redis用好容易吗?不容易.Redis的使用虽然不难,但与业务结合的应用场景特别多.特别紧,用好并不容易.我们希望通过一篇文章及Demo,即可轻松.快速入门并学会应用. ...

  8. 中小研发团队架构实践之微服务MSA

    一.MSA简介 1.1.MSA是什么 微服务架构MSA是Microservice Architecture的简称,它是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相通讯.互相配合, ...

  9. 中小型研发团队架构实践七:集中式日志ELK

    一.集中式日志 日志可分为系统日志.应用日志以及业务日志,系统日志给运维人员使用,应用日志给研发人员使用,业务日志给业务操作人员使用.我们这里主要讲解应用日志,通过应用日志来了解应用的信息和状态,以及 ...

随机推荐

  1. CodeForces 159c String Manipulation 1.0

    String Manipulation 1.0 Time Limit: 3000ms Memory Limit: 262144KB This problem will be judged on Cod ...

  2. 摆脱技术思维,转向产品思维——寻找“万能”IDC的苦恼

    背景:近期在新产品的开发任务完毕后一直在为寻找好的IDC和优质的托管服务忙碌.需求源自于我们重点要解决之前老版产品面临的国内外用户訪问速度慢甚至连接不上的问题. 除去架构技术上使用高性能.可扩展的方案 ...

  3. SSH密码错误几次后封禁登录IP

    #!/bin/bash yum -y install vixie-cron crontabs mkdir -p /usr/local/cron/ cat > /usr/local/cron/ss ...

  4. 给指定的用户无需密码执行 sudo 的权限

    给指定的用户无需密码执行 sudo 的权限 cat /etc/passwd 可以查看所有用户的列表 w 可以查看当前活跃的用户列表 cat /etc/group 查看用户组 cat /etc/pass ...

  5. js22--链式调用

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  6. vim-复制、粘贴

    选中某些行,可以在命令行模式下执行如下操作 v(小写),按上下左右键,可以选中某些行 V(大写),按上下键,这时候可以直接选中光标所在的行 ctrl+v(小写),可以选中一个矩形区域 取消选中,这些指 ...

  7. 洛谷 P1313 计算系数

    题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数. 输入输出格式 输入格式: 输入文件名为factor.in. 共一行,包含5 个整数,分别为 a ,b ,k , ...

  8. Objc执行时读取和写入plist文件遇到的问题

    以下是本猫保持游戏NPC和物件交互的plist文件: 随着游戏和玩家逐步发生互动,玩家会改动人物和物件的交互的状态.这也是RPG游戏最主要的功能. 在切换每一个地图时须要将上一个地图发生的改变存储到p ...

  9. ViewPager+Fragmrnt最简单结合方法

    Fragment和ViewPager 本博文系本菜鸟第一次博文展示,有错误之处请虽然提出 FragmentPagerAdapter 谷歌官方提供了这么一个adapter(FragmentPagerAd ...

  10. 解决iOS空指针数据的问题

    iOS开发中常常会遇到空指针的问题. 如从后台传回来的Json数据,程序中不做推断就直接赋值操作,非常有可能出现崩溃闪退. 为了解决空指针的问题,治标的方法就是遇到一个处理一个.这样业务代码里面就插了 ...