为什么要使用消息中间件

无广告小说网 m.amini.net

案例:假如我们开发了一个商品抢购网站。这个网站的目的就是在某一时间点进行抢购商品,同时要求用户注册,在注册的时候会同时给用户电话和邮箱中发送验证码,以便完成信息注册。传统做法应该是这样的。两种方式,并行即启用两个线程,当用户提交信息后,分别去发送邮件和发送短信。这种方式很明显比串行的方式更快。当我们加入消息队列后,处理方式如下图:

加入消息中间件后,我们只需要注册信息存库后,给消息队列中添加一条消息就完事了。然后邮件服务和短信服务分别去消费消息即可。

当用户注册完成后,到了抢购商品的时间,大家都去抢购某个商品的时候这个量很大。消息队列可以设置队列长度来保证系统的稳定性。当队列满了的时候,则不再处理这些用户请求。

因此我们可以总结一下消息队列的特点:

  1. 异步处理 -- 用户注册信息提交后,直接返回响应。然后邮件服务和短信服务监听到队列有消息后去主动处理
  2. 应用解耦 -- 用户注册流程分成了三个服务,注册服务、邮件服务、短信服务互不干扰。
  3. 流量削峰 -- 控制用户请求,以防系统奔溃。

常见消息中间件介绍

ActiveMQ:apache出品,能力强劲的开源消息总线,完全支持jms规范的消息中间件。api丰富,在传统行业的中小型企业中应用广泛。缺点:服务性能和数据存储性能不好。

Kafka:apache顶级项目,追求高吞吐量。一开始的目的是用于日志收集和传输。不支持事务,对消息重复,丢失,错误没有严格的请求。适合产生大量数据的互联网服务的数据收集业务。

RocketMQ:阿里开源中间件,目前已孵化成apache顶级项目,纯java开发,思路起源于kafka,对消息的可靠性传输和事务性做了优化。特点:高吞吐量、高可用。适合大规模分布式系统应用。目前在阿里集团被广泛使用,用于交易、充值,流计算,日志处理,消息推送等。现在推出了商业版,有些功能对外不开发。

RabbitMQ:是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,RabbitMQ是使用ErLang语言来编写的,并且基于AMQP协议。erlang语言开发,性能较好,高并发。社区活跃度高,网上资料比较多。

什么是AMQP协议

AMQP(Advanced Message Queuing Protocol,高级消息队列协议)是一个进程间传递异步消息网络协议

涉及到的具体概念:

  • server - 又称broker,接收客户端的链接,实现amqp实体服务。
  • Connection - 链接,应用程序跟broker的网络链接。
  • channel - 网络信道,几乎所有的操作都是在channel中进行,数据的流转都要在channel上进行。channel是进行消息读写的通道。客户端可以建立多个channel,每个channel代表一个会话任务。
  • message - 消息,服务器与应用程序之间传送的数据。由properties和body组成。properties可以对消息进行修饰,比如消息的升级,延迟等高级特性。body就是消息体的内容。
  • virtual host - 虚拟主机,用于进行逻辑隔离,最上层的消息路由,一个虚拟地址里面可以有多个交换机。exchange和消息队列message quene。
  • exchange - 交换机,接收消息,根据路由器转发消息到绑定的队列。
  • binding - 绑定,交换机和队列之间的虚拟链接,绑定中可以包含routing key。
  • routing key - 一个路由规则,虚拟机可以用它来确定如何路由一个特定消息。
  • quene - 消息队列,保存消息并将它们转发给消费者。

详细了解AMQP协议可参考这篇文章--------详解AMQP协议

交换机简单介绍

exchange:接收消息,并根据路由键转发消息所绑定的队列。

交换机的属性:

name:交换机的名称

type:交换机的类型direct,topic,fanout,headers

durability:是否需要持久化,true为持久化。

auto delete:当最后一个绑定到exchange上的队列删除后,自动删除该exchange。

internal:当前exchange是否用于rabbitMQ内部使用,默认为false。

arguments:可扩展参数。用户自自定义的交换机时,用到的参数。

交换机常用的类型为direct,topic,fanout。headers不常用。

direct(直连交换机):

  1. 所有发送到directExchange的消息被转发到RouteKey中指定的Queue

  2. rabbitmq有一个自带的exchange叫default exchange,这个交换机是direct类型的。rabbitmq会让路由键跟队列名相等进行绑定。

topic(主题交换机):

  1. 所有发送到topic exchange的消息被转发到所有关心RouteKey的Queue上

  2. Exchange将RouteKey和某些队列进行模糊匹配,此时队列需要绑定一个Topic

模糊匹配可以使用通配符:

#可以匹配一个或多个词

*只能匹配一个词

比如:"log.#"可以匹配到“log.info.oa”。“log.*”只会匹配到“log.error”

Fanout(扇型交换机):

  1. 不处理路由键,只需要简单的将队列绑定到交换机上。

  2. 发送到交换机的消息都会被转发到与该交换机绑定的所有队列上

  3. fanout交换机转发消息是最快的。

如果文章对您有帮助,请记得点赞关注哟~
欢迎大家关注我的公众号:字节传说,每日推送技术文章供大家学习参考。

rabbitmq系列(一)初识rabbitmq相关推荐

  1. 工作队列模式(任务队列)| RabbitMQ系列(二)

    相关文章 RabbitMQ系列汇总:RabbitMQ系列 前言 工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成. 相反我们安排任务在之后执行.我们把任务封装为消息并 ...

  2. MQ消息的自动应答和手动应答| RabbitMQ系列(三)

    相关文章 RabbitMQ系列汇总:RabbitMQ系列 前言 开始消息应答之前先思考几个问题 消费者完成一个任务可能需要一段时间,如果其中一个消费者处理一个长的任务并仅只完成 了部分突然它挂掉了,会 ...

  3. RabbitMQ系列之【启动过程中遇到问题及解决方案】

    RabbitMQ系列之[启动过程中遇到问题及解决方案] 参考文章: (1)RabbitMQ系列之[启动过程中遇到问题及解决方案] (2)https://www.cnblogs.com/feixiabl ...

  4. rabbitmq系列问题解决:406, “PRECONDITION_FAILED - inequivalent arg ‘durable‘

    rabbitmq系列问题解决:406, "PRECONDITION_FAILED - inequivalent arg 'durable' 参考文章: (1)rabbitmq系列问题解决:4 ...

  5. RabbitMQ系列教程之四:路由(Routing)

    在上一个教程中,我们构建了一个简单的日志系统,我们能够向许多消息接受者广播发送日志消息. 在本教程中,我们将为其添加一项功能 ,这个功能是我们将只订阅消息的一个子集成为可能. 例如,我们可以只将关键的 ...

  6. RabbitMQ系列教程之三:发布\/订阅(Publish\/Subscribe)

    在前一个教程中,我们创建了一个工作队列.工作队列背后的假设是每个任务会被交付给一个[工人].在这一部分我们将做一些完全不同的事情--我们将向多个[消费者]传递信息.这种模式被称为"发布/订阅 ...

  7. RabbitMQ系列教程之二:工作队列(Work Queues)

    今天开始RabbitMQ教程的第二讲,废话不多说,直接进入话题.   (使用.NET 客户端 进行事例演示) 在第一个教程中,我们编写了一个从命名队列中发送和接收消息的程序.在本教程中,我们将创建一个 ...

  8. centos安装rabbitmq_【SpringBoot MQ系列教程】RabbitMq 初体验

    SpringBoot 系列教程之 RabbitMq 初体验​mp.weixin.qq.com mq 在异步解耦削峰的优势非常突出,现在很多的项目都会用到,掌握 mq 的知识点,了解如何顺畅的使用 mq ...

  9. RabbitMQ系列(三)RabbitMQ交换器Exchange介绍与实践

    RabbitMQ交换器Exchange介绍与实践 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchang ...

  10. RabbitMQ系列——Rabbitmq Plugin configuration unchanged. 解决方案

    RabbitMQ系列--Rabbitmq Plugin configuration unchanged. 解决方案 一.问题概述 cmd命令窗口执行rabbitmq-plugins enable ra ...

最新文章

  1. HDLBits 系列(17) 计数器的级联实现1000分频的分频器
  2. oracle用户管理的完全恢复5:控制文件损坏(控制文件前后内容未改变)
  3. 4个Keynote、12篇论文分享、40个Poster,CVPR 2021论文分享会全日程公布
  4. java.lang.NumberFormatException: For input string: “name”
  5. 在Vaadin和JSF之间选择
  6. 微信年终奖人均 280 万?拼多多再追平京东;苹果再三致谢腾讯 | 极客头条
  7. Graph Theory
  8. 怎么样打印cxgrid过滤后的数据
  9. Atitit 如何利用先有索引项进行查询性能优化
  10. 【Gym — 101473 G】Lines of Containers【思维题】
  11. 【算法/数论】欧拉筛法详解:过程详述、正确性证明、复杂度证明
  12. 图解机器学习基本概念及分类
  13. 【交互设计】手机上的跳转操作
  14. AutoRun类型分析
  15. JS,等额本息,等额本金计算器
  16. TFS工作项模板自定义指南
  17. 新版 | 小O地图V0.9.2.0
  18. 原型设计都有哪些好用的软件?
  19. 1434:相亲的胖胖
  20. 小程序仿朋友圈、表白墙应用实现简单的发表功能

热门文章

  1. bzoj 4418: [Shoi2013]扇形面积并
  2. ABAP ME21N屏幕增强
  3. GPT-4 插件和插件化的思考
  4. java抢答器代码_八路抢答器代码与说明
  5. gdb 笔记(04)— 启用/禁用断点、启用断点一次、查看断点、删除断点、启用断点并命中N次、忽略断点前N次命中)
  6. iperf3 实现吞吐量测试及交叉编译
  7. 一招解决QQ面板上按钮失灵的问题
  8. 利用SEO技术赚钱经典案例分享
  9. C语言数组练习-计算数组中元素的最大值及其所在的行列下标值
  10. linux chown x权限,linux权限命令chown