
rabbitmq
朱小厮
你知道的越多 你不知道的也就越多
展开
-
新书《深入理解Kafka:核心设计与实践原理》上架,感谢支持~
新书上架初识 Kafka 时,笔者接触的还是 0.8.1 版本,Kafka 发展到目前的 2.x 版本,笔者也见证了Kafka的蜕变,比如旧版客户端的淘汰、新版客户端的设计、Kafka 控制器的迭代优化、私有协议的变更、事务功能的引入等。Kafka从昔日的新星逐渐走向成熟,再到今日的王者地位不可撼动,这期间有太多的故事可讲。刚接触 Kafka 时,市面上还并没有任何关于 Kafka 的书籍。在...原创 2019-02-24 00:40:53 · 7810 阅读 · 17 评论 -
RabbitMQ的安装及集群搭建方法
RabbitMQ安装1 安装erlang 下载地址:http://www.erlang.org/downloads 博主这里采用的是otp_src_19.1.tar.gz (200MB+)[root@hidden util]# tar zxvf otp_src_19.1.tar.gz[root@hidden util]# cd otp_src_19.1 [root@hidde...原创 2016-12-08 21:03:22 · 33789 阅读 · 1 评论 -
RabbitMQ常用命令
服务启动关闭启动:rabbitmq-server -detached 关闭:rabbitmqctl stop集群配置相关命令rabbitmqctl stop_app rabbitmqctl reset 在当前集群中加入某节点:rabbitmqctl join_cluster {rabbit_node_name} (某些低版本可以采用rabbitmqctl cluster ...原创 2016-12-08 21:09:17 · 30257 阅读 · 2 评论 -
RabbitMQ之mandatory和immediate
1. 概述mandatory和immediate是AMQP协议中basic.publish方法中的两个标识位,它们都有当消息传递过程中不可达目的地时将消息返回给生产者的功能。对于刚开始接触RabbitMQ的朋友特别容易被这两个参数搞混,这里博主整理了写资料,简单讲解下这两个标识位。mandatory 当mandatory标志位设置为true时,如果exchange根据自身类型和消息rou...原创 2017-02-07 19:24:34 · 16740 阅读 · 1 评论 -
RabbitMQ之TTL(Time-To-Live 过期时间)
1. 概述RabbitMQ可以对消息和队列设置TTL. 目前有两种方法可以设置。第一种方法是通过队列属性设置,队列中所有消息都有相同的过期时间。第二种方法是对消息进行单独设置,每条消息TTL可以不同。如果上述两种方法同时使用,则消息的过期时间以两者之间TTL较小的那个数值为准。消息在队列的生存时间一旦超过设置的TTL值,就称为dead message, 消费者将无法再收到该消息。2...原创 2017-02-07 21:04:26 · 28483 阅读 · 13 评论 -
RabbitMQ之死信队列
DLX, Dead-Letter-Exchange。利用DLX, 当消息在一个队列中变成死信(dead message)之后,它能被重新publish到另一个Exchange,这个Exchange就是DLX。消息变成死信一向有一下几种情况:消息被拒绝(basic.reject/ basic.nack)并且requeue=false消息TTL过期(参考:RabbitMQ之TTL(Time-T...原创 2017-02-08 20:46:39 · 52024 阅读 · 14 评论 -
RabbitMQ之队列优先级
优先级队列,顾名思义,具有更高优先级的队列具有较高的优先权,优先级高的消息具备优先被消费的特权。 本文主要讲解如何使用RabbitMQ实现队列优先级。可以通过RabbitMQ管理界面配置队列的优先级属性,如下图的x-max-priority. 也可以通过代码去实现,比如:Map<String,Object> args = new HashMap<String,...原创 2017-02-14 19:54:41 · 17199 阅读 · 1 评论 -
RabbitMQ之RPC实现
什么是RPC?RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。为什么RPC呢?就是无法在一个进程内,甚至一个计算机内通过本地调用的方式完成的需求,比如不同的系统间的通讯,甚至不同的组织间的通讯。由于计算能力需要横向扩展,需要在多台机器组成的集...原创 2017-02-15 20:28:29 · 18313 阅读 · 3 评论 -
RabbitMQ基础概念详解
RabbitMQ简介AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言转载 2017-03-01 18:51:48 · 12098 阅读 · 5 评论 -
RabbitMQ之监控(1)
RabbitMQ作为一个工业级的消息中间件,肯定是缺少不了监控的,RabbitMQ提供了WEB版的页面监控(访问地址:http://xxx.xxx.xxx.xxx:15672/,默认端口号是15672。原文:The web UI is located at: http://server-name:15672/),类似于如下: 当然,需要有相关功能的前提是开启了:rabbitmqctl rab...原创 2017-03-09 20:24:41 · 25548 阅读 · 7 评论 -
RabbitMQ之Consumer消费模式(Push & Pull)
概述消息中间件有很多种,进程也会拿几个来对比对比,其中一种对比项就是消费模式。消息的消费模式分Push,Push两种,或者两者兼具。RabbitMQ的消费模式就是兼具Push和Pull。 本文通过demo代码以及借助wireshark抓包工具来观察RabbitMQ的消费模式。push模式发送端向broker端发送数据,数据内容为:RabbitMQ Demo Test, Send ...原创 2017-03-17 16:12:47 · 52293 阅读 · 8 评论 -
RabbitMQ Network Partitions 处理策略
网络分区的意义RabbitMQ的模型类似交换机模型,且采用erlang这种电信网络方面的专用语言实现。RabbitMQ集群是不能跨LAN部署(如果要WAN部署需要采用专门的插件)的,也就是基于网络情况良好的前提下运行的。这种假设就好比paxos并不解决拜占庭问题。为什么RabbitMQ需要这种前提假设?这个它本身的数据一致性复制原理有关。RabbitMQ采用的镜像队列是一种环形的逻辑结构,...原创 2017-06-27 00:08:19 · 14662 阅读 · 4 评论 -
RabbitMQ Network Partitions 服务日志对比
如果你一直使用RabbitMQ作为业务的消息中间件,难免会遇到网络分区(Network Partitions)的故障,也许你当时会束手无策,一脸懵逼,不过希望在看完这篇文章之后,能给你一点解决网络分区的思路。RabbitMQ中所有节点状态的变更都会记录在日志当中,日志默认地址为:$RABBITMA_HOME/var/log/rabbitmq/rabbit@node*.log。所以当网络分区发生...原创 2017-06-24 18:18:16 · 4262 阅读 · 0 评论 -
RabbitMQ脑裂
在RabbitMQ3.4.x中会出现错误的网络分区检测(某种意义上可以称之为脑裂)的现象,本文通过实验验证此现象,愿小伙伴们少走弯路。Preview网上有两篇帖子(需要翻墙) https://groups.google.com/forum/#!topic/rabbitmq-users/dt8VFhMb2zM https://groups.google.com/forum/#!top...原创 2016-11-22 21:13:32 · 19288 阅读 · 5 评论 -
RabbitMQ单机多实例配置
由于某些因素的限制,有时候你不得不在一台机器上去搭建一个rabbitmq集群,当然这种集群只适合自己玩玩,验证下结论,这个有点类似zookeeper的单机版。真实生成环境还是要配成多机集群的。有关怎么配置多机集群的可以参考其他的资料,这里主要论述如何在单机中配置多个rabbitmq实例。主要参考官方文档:https://www.rabbitmq.com/clustering.html前提 ...原创 2016-11-21 21:34:31 · 16062 阅读 · 18 评论 -
消息中间件选型分析——从Kafka与RabbitMQ的对比来看全局
一、前言消息队列中间件(简称消息中间件)是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下提供应用解耦、弹性伸缩、冗余存储、流量削峰、异步通信、数据同步等等功能,其作为分布式系统架构中的一个重要组件,有着举足轻重的地位。目前开源的消息中间件可谓是琳琅满目,能让大家耳熟能详的就有很多,比如Acti...原创 2018-04-07 00:56:44 · 42578 阅读 · 19 评论 -
RabbitMQ之消息确认机制(事务+Confirm)
概述在使用RabbitMQ的时候,我们可以通过消息持久化操作来解决因为服务器的异常奔溃导致的消息丢失,除此之外我们还会遇到一个问题,当消息的发布者在将消息发送出去之后,消息到底有没有正确到达broker代理服务器呢?如果不进行特殊配置的话,默认情况下发布操作是不会返回任何信息给生产者的,也就是默认情况下我们的生产者是不知道消息有没有正确到达broker的,如果在消息到达broker之前已经丢失原创 2017-02-17 16:33:09 · 134930 阅读 · 62 评论 -
《RabbitMQ实战指南》笔误及改进记录
2017年12月上旬笔者的一本新书——《RabbitMQ实战指南》上架,里面的校稿都是自己独自完成的,一共进行了15遍,但还是会有漏网之鱼。本篇博文用来记录现在发现的一些笔误,一是给购书的朋友一个参考,以防被笔误所迷惑;二是提供一个记录笔误的地方,方便再次印刷修改之用,这样也能进一步的完善这本书。小伙伴们也可以提供一些新发现的笔误之处,这里都会记录,为了鼓励大家,发现笔误的小伙伴会在下一次印刷...原创 2017-12-12 20:09:51 · 17935 阅读 · 70 评论 -
消息中间件(Kafka/RabbitMQ)收录集
本篇主要整理工作中遇到的一些消息中间件的相关知识,包括Kafka, RabbitMQ, RocketMQ, ActiveMQ等,不排除收录其他消息中间件的可能。 这里会持续收录相关知识,包括安装、部署、使用示例、监控、运维、原理等。 所有新撰写的与中间件有关的文章都会收录与此,注意保存本文链接。Last Update Time: 2018-04-19 01:19:50 Update ...原创 2017-01-26 10:42:12 · 14655 阅读 · 25 评论 -
RabbitMQ之消息持久化
消息的可靠性是RabbitMQ的一大特色,那么RabbitMQ是如何保证消息可靠性的呢——消息持久化。 为了保证RabbitMQ在退出或者crash等异常情况下数据没有丢失,需要将queue,exchange和Message都持久化。queue的持久化queue的持久化是通过durable=true来实现的。 一般程序中这么使用:Connection connectio原创 2017-03-08 16:53:06 · 104718 阅读 · 23 评论 -
模拟RabbitMQ网络分区
1. 概述正常情况下,很难观察到RabbitMQ网络分区的发生。为了更好的理解网络分区,需要某些手段将其模拟出来,以便对其做相应的分析处理,进而在正式应用环境中遇到类似情形可以处理的游刃有余。往长远方面讲,也可以采取一些必要的手段去避免网络分区的发生,或者可以监控网络分区以便对其迅速处理。模拟网络分区的方式有多种,主要分为以下3大类:iptables封禁/解封IP地址或者端口号。关原创 2017-07-11 20:40:08 · 3447 阅读 · 0 评论 -
RabbitMQ Network Partitions
Clustering and Network Partitions RabbitMQ clusters do not tolerate network partitions well. If you are thinking of clustering across a WAN, don’t. You should use federation or the shovel instead. H翻译 2016-12-12 21:11:51 · 4771 阅读 · 0 评论 -
RabbitMQ负载均衡(3)——Keepalived+HAProxy实现高可用的负载均衡
试想下如果前面配置的HAProxy主机192.168.0.9突然宕机或者网卡失效,那么虽然RabbitMQ集群没有任何故障,但是对于外界的客户端来说所有的连接都会被断开,结果将是灾难性的。确保负载均衡服务的可靠性同样显得十分的重要。这里就引入Keepalived工具,它能够通过自身健康检查、资源接管功能做高可用(双机热备),实现故障转移。Keepalived采用VRRP(Virtual Rou...原创 2017-08-14 22:50:09 · 11131 阅读 · 12 评论 -
RabbitMQ消息可靠性分析
Introduction有很多人问过我这么一类问题:RabbitMQ如何确保消息可靠?很多时候,笔者的回答都是:说来话长的事情何来长话短说。的确,要确保消息可靠不只是单单几句就能够叙述明白的,包括Kafka也是如此。可靠并不是一个绝对的概念,曾经有人也留言说过类似全部磁盘损毁也会导致消息丢失,笔者戏答:还有机房被炸了也会导致消息丢失。可靠性是一个相对的概念,在条件合理的范围内系统所能确保的多少...原创 2018-01-24 10:15:56 · 10465 阅读 · 5 评论 -
为什么QueueingConsumer会被Deprecated?
QueueingConsumer在Rabbitmq客户端3.x版本中用的如火如荼,但是在4.x版本开初就被标记为@Deprecated,这是为什么呢?本文就此展开探讨。在我的博文《RabbitMQ之Consumer消费模式(Push & Pull)》中讲到,Consumer的消费模式有Pull 和 Push两种,而经常用到的就是Push模式,Push模式在3.x的用法demo如下:Qu原创 2017-05-07 17:50:30 · 9316 阅读 · 6 评论 -
RabbitMQ的元数据重建
1.概述对于RabbitMQ运维层面来说,扩容和迁移是必不可少。扩容比较简单,一般往集群中加入新的机器节点即可,不过新的机器节点中是没有消息的,如果想要新加入的节点能快速的存储消息还是需要做点小手术的。不过这是后话,本文的主要内容是迁移,而迁移的首要工作就是为新的集群重建原集群的元数据。重建RabbitMQ元数据,说白了就是在新的集群上重新创建exchange、queue以及彼此的bind...原创 2017-06-12 19:29:45 · 8875 阅读 · 4 评论 -
Highly Available (Mirrored) Queues
本文翻译RabbitMQ官方文档:Highly Available (Mirrored) Queues,原文地址:http://www.rabbitmq.com/ha.html。(翻译水平有限,不喜轻喷~~)高可用(镜像)队列默认情况下,queues存放在RabbitMQ集群的单个节点之上。exchanges和bindings恰恰相反,在集群中的所有节点中都有存档。queues可以配置...翻译 2017-05-11 19:41:40 · 3815 阅读 · 0 评论 -
(RabbitMQ) Java Client API Guide
本篇翻译的是RabbitMQ官方文档关于API的内容,原文链接:http://www.rabbitmq.com/api-guide.html。博主对其内容进行大体上的翻译,有些许部分会保留英文,个人觉得这样更加有韵味,如果全部翻译成中文,会存在偏差,文不达意(主要是功力浅薄~~)。文章也对部分内容进行一定的解释,增强对相关知识点的理解。OverviewRabbitMQ java cli...翻译 2017-05-07 17:48:43 · 16076 阅读 · 0 评论 -
RabbitMQ负载均衡(2)——HAProxy
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案,包括Twitter,Reddit,StackOverflow,GitHub在内的多家知名互联网公司在使用。HAProxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。安装HAProxy首先需要去HAProxy的官网下载HAProxy的安装文件,目...原创 2017-08-13 22:26:43 · 7359 阅读 · 7 评论 -
RabbitMQ负载均衡(4)——LVS
负载均衡的方案有很多,适合RabbitMQ使用的处理HAProxy之外还有LVS。LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org。现在LVS已经是 Linux标准内核的一部分,在Linux2.6.32内核以前,使用LVS时必须要重新编译内核以支持LVS功能...原创 2017-08-15 23:23:41 · 4813 阅读 · 3 评论 -
RabbitMQ之监控(2)
本文接RabbitMQ之监控(1)。不管是通过HTTP API接口还是客户端,获取的数据都是为了提供监控视图之用,不过这一切都基于RabbitMQ服务运行完好的情况下。虽然可以通过某些其他工具或方法来检测RabbitMQ进程是否在运行(如:ps aux | grep rabbitmq),或者5672端口是否开启(如:telnet xxx.xxx.xxx.xxx 5672),但是这样依旧不能真正...原创 2017-09-03 21:48:22 · 6997 阅读 · 4 评论 -
RabbitMQ之监控(3)
确保RabbitMQ能够健康的运行还不足以让人放松警惕。考虑这样一种情况:小明为小张创建了一个队列并绑定了一个交换器,之后某人由于疏忽而阴差阳错的删除了这个队列而无人得知,最后小张在使用这个队列的时候就会报出“NOT FOUND”的错误。如果这些在测试环境中发生,那么还可以弥补。如果在实际生产环境中,如果误删了一个队列,那必然会造成不可估计的影响。此时业务方如果正在使用这个队列,正常情况下会立刻报...原创 2017-09-04 22:17:56 · 5134 阅读 · 0 评论 -
RabbitMQ之惰性队列(Lazy Queue)
RabbitMQ从3.6.0版本开始引入了惰性队列(Lazy Queue)的概念。惰性队列会尽可能的将消息存入磁盘中,而在消费者消费到相应的消息时才会被加载到内存中,它的一个重要的设计目标是能够支持更长的队列,即支持更多的消息存储。当消费者由于各种各样的原因(比如消费者下线、宕机亦或者是由于维护而关闭等)而致使长时间内不能消费消息造成堆积时,惰性队列就很有必要了。默认情况下,当生产者将消息发送...原创 2017-09-15 01:50:49 · 7861 阅读 · 2 评论 -
RabbitMQ管理(1)——多租户与权限
每一个RabbitMQ服务器都能创建虚拟的消息服务器,我们称之为虚拟主机(virtual host),简称为vhost。每一个vhost本质上是一个独立的小型RabbitMQ服务器,拥有自己独立的队列、交换器以及绑定关系等待,并且它拥有自己独立的权限。vhost就像是虚拟机与物理服务器一样,它们在各个实例间提供逻辑上的分离,允许你为不同程序安全保密地运行数据,它既能将同一个RabbitMQ的中众多...原创 2017-09-26 23:42:44 · 6438 阅读 · 0 评论 -
RabbitMQ管理(2)——用户管理
在RabbitMQ中,用户是访问控制(Access Control)的基本单元,且单个用户可以跨越多个vhost进行授权。针对一至多个vhost,用户可以被赋予不同级别的访问权限,并使用标准的用户名和密码来认证用户。 创建用户的命令为:rabbitmqctl add_user {username} {password}。其中username表示要创建的用户名称;password表示创建用户登录的...原创 2017-10-09 12:23:40 · 4743 阅读 · 0 评论 -
RabbitMQ管理(3)——Web端管理
前面讲述的都是使用rabbitmqctl工具来管理RabbitMQ,有些时候你是否会觉得这种方式是不是不太友好?而且为能够运行rabbitmqctl工具,当前的用户需要拥有访问Erlang cookie的权限,由于服务器可能是以guest或者rabbit用户身份来运行的,因此你需要获得这些文件的访问权限,这样就引申出来一些权限管理的问题。RabbitMQ的开发团队也考虑到了这种情况,并且开发了...原创 2017-10-11 00:03:02 · 12733 阅读 · 3 评论 -
RabbitMQ管理(4)——应用管理
本文主要阐述应用与集群相关的一些操作管理命令,包括关闭、重置、开启服务,还有建立集群的一些信息。有关集群搭建更多的信息可以参考RabbitMQ的安装及集群搭建方法。rabbitmqctl stop [pid_file] 用于停止运行RabbitMQ的Erlang虚拟机和RabbitMQ服务应用。如果指定了pid_file,还需要等待指定进程的结束。其中pid_file是通过调用rabbitm...原创 2017-10-13 01:57:54 · 2267 阅读 · 0 评论 -
RabbitMQ如何实现延迟队列?
什么是延迟队列延迟队列存储的对象肯定是对应的延迟消息,所谓”延迟消息”是指当消息被发送以后,并不想让消费者立即拿到消息,而是等待指定时间后,消费者才拿到这个消息进行消费。场景一:在订单系统中,一个用户下单之后通常有30分钟的时间进行支付,如果30分钟之内没有支付成功,那么这个订单将进行一场处理。这是就可以使用延迟队列将订单信息发送到延迟队列。场景二:用户希望通过手机远程遥控家里的智能设...原创 2017-02-14 21:10:08 · 18265 阅读 · 11 评论 -
[九]RabbitMQ-客户端源码之Consumer
在[八]RabbitMQ-客户端源码之ChannelN中讲述basicConsume的方法时设计到Consumer这个回调函数,Consumer其实是一个接口,真正实现它的是QueueingConsumer和DefaultConsumer,且DefaultConsumer是QueueingConsumer的父类,里面都是空方法。在用户使用时可以简单的采用QueueingConsumer或者采用De...原创 2017-04-17 19:15:46 · 9897 阅读 · 3 评论 -
RabbitMQ管理(5)——集群管理
rabbitmqctl join_cluster {cluster_node} [–ram] 将节点加入指定集群中。在这个命令执行前需要停止RabbitMQ应用并重置节点。更多详细内容请参考RabbitMQ安装。rabbitmqctl cluster_status 显示集群的状态。更多详细内容请参考RabbitMQ安装。rabbitmqctl change_cluster_node_t...原创 2017-10-26 08:22:10 · 6882 阅读 · 0 评论