RabbitMQ原理分析

RabbitMQ原理分析RabbitMQ 简介基于 AMQP 协议实现 主要作用是解耦 冗余 扩展性 增大消息入队和处理的频率变得很容易 平滑峰值 可恢复性 送达保证 ACK 机制消费者消费消息后必须返回相应的 ACK 顺序保证等 文章当中使用的 RabbitMQ 的版本是 RabbitMQ3 6 6 关键概念 Exchange 交换机启动 RabbitMQ 相关的服务 会默认创建一个不可以删除的 Excha

RabbitMQ 简介

基于AMQP协议实现,主要作用是解耦,冗余,扩展性(增大消息入队和处理的频率变得很容易),平滑峰值,可恢复性,送达保证(ACK机制 消费者消费消息后必须返回相应的ACK),顺序保证等.

文章当中使用的RabbitMQ的版本是RabbitMQ 3.6.6.

关键概念

Exchange交换机

启动RabbitMQ相关的服务,会默认创建一个不可以删除的Exchange.
绑定规则:RoutingKey与队列名称相等(Direct).

1.Direct exchange (直接交换)
如果 Binding key 匹配, 那么Message就会被传递到相应的queue中.

2.Fanout exchange(广播类型)
多个队列会接收到这个消息
会向响应的queue广播。

3.Topic exchange (对key进行模式匹配)
routing key为一个句点号”.”分隔的字符串(我们将被句点号“. ”分隔开的每一段独立的字符串称为一个单词)

4.headers(通过headers里的键值对进行路由)
这里需要了解一下RabbitMQ的协议,可以通过rabbitmq官网下载AMQP协议.
headers类型的Exchange不依赖于routing key匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配。
在绑定Queue与Exchange时指定一组键值对;当消息发送到Exchange时,RabbitMQ会取到该消息的headers(也是一个键值对的形式),对比其中的键值对是否完全匹配Queue与Exchange绑定时指定的键值对.如果完全匹配则消息会路由到该Queue,否则不会路由到该Queue。


Queue:队列

Consumer:消费者

Binding:绑定

Vhsot:虚拟主机

虚拟主机,这个概念与nginx 虚拟域名类似,主要是一些权限的管理,vhsot的相关配置不可以跨越,完全隔离环境.

Broker/Cluster

RabbitMQ可靠性

接下来写一些重点需要介绍的内容,可靠性也与可用性息息相关.

ACK与Confirm

生产者的Confirm,与消费者的ACK类似,但是需要注意的生产者发送消息是多条消息,所以需要Confirm这个机制来保证消息被正确接收,还有Transaction机制保证消息的事务处理.

HeartBeat:心跳包

HeartBeat 作用防止TCP网络连接中断,帮助RabbitMQServer找出断开的连接.也可以用来断开空闲的连接.

消费者与生产者

这里需要注意下生产发送到消息到多个镜像队列可能会引起一些性能问题,因为需要等待每个队列的ACK.

RabbitMQ高可用

每当接受到生产者生产的消息,MASTER首先会处理消息,然后推送到备用镜像.

HA-MODE

故障恢复机制

RabbitMQ的安装

下载RabbitMQ的rpm,wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.6/rabbitmq-server-3.6.6-1.el6.noarch.rpm
yum install rabbitmq-server-3.6.6-1.el6.noarch.rpm
发现错误,安装依赖Requires: socat 。
更新源wget –no-cache http://www.convirture.com/repos/definitions/rhel/6.x/convirt.repo -O /etc/yum.repos.d/convirt.repo
yum install socat
yum install rabbitmq-server-3.6.6-1.el6.noarch.rpm
rabbitmq-server start





注意修改在iptables修改相应的端口号

浏览器访问:http://IP:15672

其它

如何查看没有ACK的消息

sudo rabbitmqctl list_queues name messages_ready messages_unacknowledged

消费者需要注意处理在故障恢复情况下的重复消息的处理,保证处理的幂等性.在一些场景尤为注意,如下单,转账等.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233956.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JS向数组添加元素,插入数据

    js中对于数组的操作很常见,下面记录一下js向数组添加元素的方法。letmyArray=[11,22,33];console.log(‘原数组:’,myArray);myArray.push(44,55);console.log(‘用push在数组后面插入元素:’,myArray);myArray.unshift(66,77);co…

    2022年4月5日
    893
  • 0x00和’0′[通俗易懂]

    0x00和’0′[通俗易懂]往往小问题才会折腾很久。msmset((void*)virt,0x00,PAGE_SIZE)和msmset((void*)virt,‘0’,PAGE_SIZE)区别就在于0x00只是为了强调就是数字0,就是为了ASCII码转换的数字0!不是字符‘0’!如果手误将数字0写作字符‘0’,那就达不到用‘\0’清空字符串的目的了。所以最近在内核中分配页的时候总是判断最后一级页表项出错,原来是在allo

    2025年7月5日
    0
  • MFC 读取EXCEL中数据[通俗易懂]

    MFC 读取EXCEL中数据[通俗易懂]MFC读取Excel例子(2013-01-1200:04:24)转载▼标签:365mfcit分类:MFC-office操作1.       首先要将excel类添加到工程中。在ClassWizard中,【AddClass】,在Excel的安装目录找到Excel.exe(Microsoft2003是Excel

    2022年6月15日
    23
  • volatile关键字在Android中到底有什么用?

    volatile关键字在Android中到底有什么用?当一个程序运行的时候,数据是保存在内存当中的,但是执行程序这个工作却是由CPU完成的。那么当CPU正在执行着任务呢,突然需要用到某个数据,它就会从内存中去读取这个数据,得到了数据之后再继续向下执行任务。这是理论上理想的工作方式,但是却存在着一个问题。我们知道,CPU的发展是遵循摩尔定律的,每18个月左右集成电路上晶体管的数量就可以翻一倍,因此CPU的速度只会变得越来越快。但是光CPU快没有用呀,因为CPU再快还是要从内存去读取数据,而这个过程是非常缓慢的,所以就大大限制了CPU的发展

    2022年5月6日
    68
  • 什么是字符串常量池_常量池中的字符串是对象吗

    什么是字符串常量池_常量池中的字符串是对象吗关于字符串与字符串常量池JDK1.8-1.9,String底层从char数组变成了byte数组,原因是部分字符仅占一个byte,而堆中含有大量的String字符串,该优化能节省较多空间。StringTable为什么要调整(移入堆内)(JDK1.6-1.7)permSize默认比较小永久代垃圾回收频率低字符串拼接操作常量与常量的拼接结果在常量池,原理是编译器优化常量池中不会存在相同内容的常量只要其中一个是变量,结果就在堆中。变量拼接的原理是StringBuilder(final不算变量)

    2022年7月28日
    22
  • ffmpeg 入门_python入门笔记

    ffmpeg 入门_python入门笔记写在前面最近在读《FFmpeg从入门到精通》这本书,结合着雷神的博客,学习音视频的知识~在学习的过程中,也记录了一些摘要。因为是边看边记的,所以一些要点在看到后面的时候,需要反过来整理前面的。我用有道云笔记写的markdown没法加图片,所以就先把这部分发了出来。后续会针对内容和排版一步步的优化,如果你被这凌乱的内容辣到了眼睛,请谅解哈哈哈~2019.06.18第一章+第二章知识点(未…

    2022年4月19日
    48

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号