RabbitMQ 在上一家公司已经接触过了, 但是懵懵懂懂的. 不是很清楚. 具体怎么个逻辑.

这次公司打算搭建新的系统. 领导要求研究一下MQ.

经过研究得出的结论是. MSMQ的设计理念不适合做系统的底层框架. 他不适合做分布式系统. 最主要的是. MSMQ如果没有消费者, 默认消息是一直存在的.

而RabbitMQ的设计理念是.只要有接收消息的队列. 邮件就会存放到队列里. 直到订阅人取走. . 如果没有可以接收这个消息的消息队列. 默认是抛弃这个消息的..

下面就把我的研究结果写一下.

如何在新的系统中使用RabbitMQ.

系统设计的两个重大问题.

第一条要满足未来的业务需求的不断变化和增加. 也就是可扩展性.

第二条要满足性能的可伸缩性. 也就是可集群性…通过增加机器能处理更多的请求

第三条要解耦合.

如果不解耦合, 未来业务增加或变更的时候你还在修改3年前写的代码.试问你有多大的把握保证升级好系统不出问题? 如何可以写新的代码而不用修改老代码所带来的好处谁都知道…

第四条简单易懂.

以上4条在任何一个系统中都要遵循的原则. 以前是无法做到的. 自从有了MQ以后. 这些都可以同时做到了.

以前的设计理念是把系统看作一个人,按照工作的指令从上到下的执行.

现在要建立的概念是, 把系统的各个功能看作不同的人. 人与人之间的沟通通过消息进行交流传递信息…

有了MQ以后把一个人的事情分给了不同的人, 分工合作所带来的好处是专业化, 并行化. 当然也引入了一些麻烦,性能开销多一些, 工作任务的完整性不能立即得到反馈.幸好我们可以通过最终一致性.来解决这个麻烦的问题…

下面进入正题.

第一个问题RabbitMQ是如何支持可扩展性的.

如上图, 寄件人P是系统的一个功能模块. 用来发送消息. 一般是在某些重要的业务状态变更时发送消息. 例如: 新订单产生时, 订单已打包时, 订单已出库时, 订单已发出时.

那么当事件 新订单产生时, 我们需要把这个信息告诉谁呢? 给财务? 还是给仓库发货?

这个地方最大的重点是. 当事件产生时. 根本不关心. 该投递给谁.

我只要把我的重要的信息投到这个乱七八糟的MQ系统即可. 其它人你该干嘛干嘛. 反正我的任务完成了. (有没有甩手掌柜的感觉..)

我只要告诉系统,我的事件属于那一类.

例如: “某某省.某某市.某某公司.产生新订单”

那么这个地址就属于 投递地址.. 至于这个地址具体投到哪个邮箱那是邮局的事情.

当然还有一些具体的订单内容也属于要告诉系统的内容.

那么下一个问题来了, 邮局怎么知道 你的这个消息应该投递给谁?

参考我们现实世界中的邮寄系统.是默认的省市县这么投递的. 这是固定思维.

但是我们的MQ系统中不是这样的. 是先有收件人的邮箱. (队列Queue). MQ才能投递. 否则就丢弃这个信息…

所以MQ系统应该先有收件人的邮箱 Queue 也就是队列. 才能接收到信息.

再有邮局

再有发信息的人.

RabbitMQ能实现系统扩展的一个重要功能在于, 可以两个邮箱收同一个地址的信.

翻译成专业的话 RabbitMQ 可以 两个队列Queue订阅同一个RoutingKey的信息..

RabbitMQ在投递的时候,会把一份信息,投递到多个队列邮箱中Queue…

这是系统可扩展性的基础.

第二个问题RabbitMQ如何满足性能的可伸缩性. 也就是可集群性

先上图

从上图, 可以看到. 性能扩展的关键点就在于 订阅人C1, 订阅人C2 轮流收到邮箱队列里面的信息, 订阅人C1和订阅人C2收到的信息内容不同, 但都属于同一类….

所以. 订阅人C1和订阅人C2是干同一种工作的客户端.用来提高处理能力.

上面说完了,如何使用. 下面再分析一下几个关注点.

如果订阅人的down机了. 信息会丢失吗?

事实上是不会的. 只要有邮箱(队列Queue)存在.信息就一直存在, 除非订阅人去取走.

如果订阅人一直down机, 邮箱队列能存多少信息?会不会爆掉?

理论上和实际上都是有上限的不可能无限多. 具体多少看硬盘吧..我没测到过上限.

我这篇文章并不打算讲解邮局的4种投递模式. 有其它文章讲的很好. 我只打算使用topic这种模式. 因为它更灵活一些.

再说一下我的另外两个观点.

不要在业务程序中用代码定义创建 邮局 ExChange. 和邮箱Queue队列 这属于系统设计者要构架的事情. 要有专门独立的程序和规则去创建. 这样可以统一管理事件类型.避免过多的乱七八糟的RoutingKey混乱.

我的理解认为

消息系统的分布式可扩展的实现在于消息广播, 集群性的实现在于邮箱队列.

RabbitMQ是先广播后队列的.

Exchange: 就是邮局的概念等同于 中国邮政和顺丰快递、

routingkey: 就是邮件地址的概念.

queue: 就是邮箱接收软件,但是可以接收多个地址的邮件,通过bind实现。

producer: 消息生产者,就是投递消息的程序。

consumer:消息消费者,就是接受消息的程序。

channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

给大家推荐一个程序员学习交流群:960439918。点击链接加入群聊【java高级架构交流群】:https://jq.qq.com/?_wv=1027&k=5fozFzF群里有分享的视频,还有思维导图群公告有视频,都是干货的,你可以下载来看。主要分享分布式架构、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战学习架构师视频。

RabbitMQ的深入理解和最简单的用途说明相关推荐

  1. rabbitMQ消息队列 – 面板介绍及简单demo

    首先rabbit安装好之后,运维会给一个控制面板. 默认账号密码为guest 登入以后可以看到具体界面. 在此鸣谢百度翻译给予的大力支持.. ###写一个简单的demo 编写之前..虽然说可以直接用底 ...

  2. rabbitmq 使用与理解全流程

    1.什么是MQ MQ(message queue),从字面意思上看消息排队,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是message ,MQ还是一种跨进程的通信机制,用于上下游传递消息 ...

  3. RabbitMQ入门之安装配置与简单实例

    为什么80%的码农都做不了架构师?>>>    简介 由于某些原因,今天接触了一下一个新的东西RabbitMQ( http://www.rabbitmq.com/)总的来说给人的感觉 ...

  4. 整合用户篇—Oauth2理解与构造简单的系统

    2019独角兽企业重金招聘Python工程师标准>>> 当你运营越来越多的项目,每个项目的业务都不一样,每个需要使用到这些业务的用户就需要注册方能进行使用.如果用户还需要使用其他项目 ...

  5. RabbitMQ的5种队列_简单队列_入门试炼_第4篇

    Statement 文章目录 一.队列总览 1.1. 图示 1.2. 说明 二.简单队列 2.1. 图示 2.2. 导入RabbitMQ的客户端依赖 2.3. 获取MQ的连接 2.4. 生产者发送消息 ...

  6. rabbitMQ在spring boot中的简单应用

    在项目中引入amqp依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId ...

  7. 刚安装的python如何使用-python中RabbitMQ的使用(安装和简单教程)

    1,简介 RabbitMQ(Rabbit Message Queue)是流行的开源消息队列系统,用erlang语言开发. 1.1关键词说明: Broker:消息队列服务器实体. Exchange:消息 ...

  8. 一文理解CPU进行简单加法(计算机组成原理5.1CPU的功能和基本结构)

    这篇文章真的是千呼万唤始出来!总结这部分知识点花了不少时间. 对不起好兄弟萌,我写得这么垃圾还拖更. 5.1.1CPU的功能 5.1.1.1 CPU的基本功能 指令控制:完成取指令,分析指令和执行指令 ...

  9. c语言吃豆人游戏怎么理解,python 实现简单的吃豆人游戏

    效果展示: 程序简介 1.使用pygame模组 2.在material目录下有一些素材 3.吃豆人的游戏主体 4.吃豆人怪物的AI(未使用深度学习) 主要代码 main.py import pygam ...

最新文章

  1. 使用Wireshark进行DNS协议解析
  2. 清华大学微纳脑机接口与机器人实验室:生物材料研发工程师招聘
  3. XSLT 2.0 in .NET
  4. 为什么一个程序申请的内存有限制_为什么要做自己的小程序商城,做一个要多久?...
  5. 字典-字典的增删改查常用操作
  6. Shady 深度学习课程
  7. 通过cookie保存并读取用户登录信息实例
  8. 机器学习 正则化(regularization)
  9. 放心!没人在意你使用的是命令式编程还是声明式编程
  10. 《Java Web开发速学宝典》样章(共3章)
  11. 谷歌浏览器下载更新(附带谷歌安装包百度云)
  12. 俄罗斯无线认证-FAC认证
  13. 常用或特别的人类fasta参考基因组下载链接
  14. Hexo博客添加搜索功能
  15. java重要代码词汇_java基础必备词汇
  16. 服务器带宽运营商排行,电信和移动哪个网速快(三大运营商4g网速排名)
  17. SAP MM STO单据的外向交货单创建后新加ITEM?
  18. 雷达数据处理及应用第三版 pdf_应用 | quot;倾斜摄影+地面激光雷达quot;实景融合建模法:保证建模效率,提高模型精度...
  19. 马哥python学费_2019马哥教育课程升级及学费调整通知
  20. mg动画应用领域有哪些?看过来! | 万彩动画大师

热门文章

  1. map函数作用c语言,C语言 · C++中map的用法详解
  2. 用户不在sudoers文件中,此事将被报告
  3. git日常使用的常用命令总结
  4. SQL横表与纵表互转
  5. python中的tab补全功能添加
  6. 记杨绛先生的经典语句
  7. iOS开发 - 不进入待机(屏幕保持唤醒)---UIApplication学习
  8. 基于Tomcat的JSP开发过程中的中文乱码问题解决
  9. zookeeper在Windows底下的安装和使用
  10. Struts2的ValueStack(值栈)介绍