rabbitmq的中文资料真少,和同事lucas经过两周的学习,讨论,测试,终于搞清了部分rabbitmq的知识,先总结一下
1,Connection
连接,与rabbitmq server建立的一个连接,由ConnectionFactory创建,虽然创建时指定 了多个server address,但每个connection只与一个物理的server进行连接,此连接是基于Socket进行连接的,这个可以相似的理解为像一个DB Connection。
ConnectionParameters params = new ConnectionParameters();
params.setUsername(userName);
params.setPassword(password);
params.setVirtualHost(virtualHost);
params.setRequestedHeartbeat(0);
ConnectionFactory factory = new ConnectionFactory(params);
Connection conn = factory.newConnection(hostName,
AMQP.PROTOCOL.PORT);
2,Channel
建立在connection基础上的一个通道,相对于connection来说,它是轻量级的。可以这样理解,它就像是hibernate里面的session一样,相对于DB Connection来说,session就是一个轻量级的东西。
Channel channel = conn.createChannel();
注:尽量避免在多线程中使用一个channel,Channel javadoc有如下说明:
While a Channel can be used by multiple threads, it's important to ensure
that only one thread executes a command at once. Concurrent execution of
commands will likely cause an UnexpectedFrameError to be thrown.
另官方Java Client API Guide里面也同样提到
Channel thread-safety
In general, Channel instances should not be used by more than one thread simultaneously: application code should maintain a clear notion of thread ownership for Channel instances. If more than one thread needs to access a particular Channel instance, the application should enforce mutual exclusion itself, for example by synchronising on the Channel.
Symptoms of incorrect serialisation of Channel operations include, but are not limited to, de>IllegalStateExceptionde>s with the message "cannot execute more than one synchronous AMQP command at a time", and de>UnexpectedFrameErrorde>s.
3,Exchange,Queue,RoutingKey
先看下面一张图
蓝色-- Client(相对于Rabbitmq Server来说)
绿色--Exchange
红色—Queue
- 交换器(Exchange),它是发送消息的实体。
- 队列(Queue),这是接收消息的实体。
- 绑定器(Bind),将交换器和队列连接起来,并且封装消息的路由信息。
Exchange指向Queue的黑色线—RoutingKey,可以将它简单的理解为一条连接Exchange和Queue的路线
Exchange和Queue都需要通过channel来进行定义,而RoutingKey则只需要在binding时取个名字就行了。
这一块的理解是不正确的,具体参见 rabbitmq 学习-8- Exchange Queue RoutingKey关系说明
左边的Client向右边的Client发送消息,流程:
1, 获取Conection
2, 获取Channel
3, 定义Exchange,Queue
4, 使用一个RoutingKey将Queue Binding到一个Exchange上
5, 通过指定一个Exchange和一个RoutingKey来将消息发送到对应的Queue上,
6, 接收方在接收时也是获取connection,接着获取channel,然后指定一个Queue直接到它关心的Queue上取消息,它对Exchange,RoutingKey及如何binding都不关心,到对应的Queue上去取消息就OK了
一个Client发送消息,哪些Client可以收到消息,其核心就在于Exchange,RoutingKey,Queue的关系上。
|
Exchange
|
RoutingKey
|
Queue
|
1
|
E1
|
R1
|
Q1
|
2
|
|
R2
|
Q2
|
3
|
E2
|
R3
|
Q1
|
4
|
|
R4
|
Q2
|
5
|
E1
|
R5
|
Q1
|
6
|
E2
|
R6
|
Q1
|
我们可以这样理解,RoutingKey就像是个中间表,将两个表的数据进行多对多关联,只不过对于相同的Exchange和Queue,可以使用不同的RoutingKey重复关联多次。
注:本人现在使用的是rabbitmq server 1.7.2,它使用的AMQP 0.8协议,最新的1.0里面有些东西有变化,比如Exchange type,1.0里面还有个system
Exchange在定义的时候是有类型的,以决定到底是哪些Queue符合条件,可以接收消息
Exchange Type 说明
|
fanout
|
所有bind到此exchange的queue都可以接收消息
|
direct
|
通过routingKey和exchange决定的那个唯一的queue可以接收消息
|
topic
|
所有符合routingKey(此时可以是一个表达式)的routingKey所bind的queue可以接收消息
表达式符号说明:#代表一个或多个字符,*代表任何字符
例:#.a会匹配a.a,aa.a,aaa.a等
*.a会匹配a.a,b.a,c.a等
注:使用RoutingKey为#,Exchange Type为topic的时候相当于使用fanout
|
headers
|
|
相关推荐
RabbitMQ rabbitmq-server-3.6.12-1.el6.noarch 及其安装所需要的软件打包都在这里面,主要报卡一下软件:socat-1.7.3.2.tar.gz、rabbitmq-server-3.6.12-1.el6.noarch.rpm、rabbitmq-release-signing-key.asc、otp_...
在使用`rabbitmq-c`时,开发者需要理解AMQP协议的基础知识,包括交换机、队列、绑定和消息路由策略。同时,熟悉C编程和错误处理技巧也是必要的,因为`rabbitmq-c`的API是C语言风格的,需要手动管理内存和错误检查。 ...
在Linux环境下,RabbitMQ的安装通常涉及下载其发行版的tar.gz文件,例如"rabbitmq-server-generic-unix-3.5.4.tar.gz"。这个版本是专门为Linux系统设计的。 首先,我们来详细解释一下RabbitMQ的核心概念和功能。...
《深入理解RabbitMQ客户端库:rabbitmq-c》 RabbitMQ是一款广泛应用的消息中间件,它基于AMQP(Advanced Message Queuing Protocol)协议,提供高效、可靠的消息传递服务。在开发过程中,为了与RabbitMQ服务器进行...
rabbitmq-server-3.11.13rabbitmq-server-3.11.13rabbitmq-server-3.11.13rabbitmq-server-3.11.13rabbitmq-server-3.11.13rabbitmq-server-3.11.13rabbitmq-server-3.11.13rabbitmq-server-3.11.13rabbitmq-server-...
rabbitmq-server-3.9.11.exe
在安装`rabbitmq-server-3.8.3`之前,首先需要了解一些基础概念: 1. **消息队列**:消息队列是中间件的一种,它存储来自生产者的消息,并在适合的时候将其传递给消费者,确保消息的可靠传输。 2. **AMQP协议**:...
rpm -ivh rabbitmq-server-3.6.5-1.noarch.rpm systemctl status rabbitmq-server systemctl start rabbitmq-server systemctl stop rabbitmq-server systemctl restart rabbitmq-server systemctl enable ...
1. **下载与解压**:首先,从官方网站或者提供的链接下载`rabbitmq-server-mac-standalone-3.5.3.tar.gz`,然后使用`tar -zxvf rabbitmq-server-mac-standalone-3.5.3.tar.gz`命令将其解压缩。 2. **环境配置**:...
在您提供的资源中,“rabbitmq-server-generic-unix-3.5.7.tar.rar”是一个针对Linux平台的RabbitMQ服务器的离线安装包。这个版本为3.5.7,您需要在Windows环境下解压后再用于Linux系统。下面将详细介绍RabbitMQ的...
最新版linux rabbitmq-server-generic-unix-3.8.14.tar.xz最新版linux rabbitmq-server-generic-unix-3.8.14.tar.xz
rabbitmq-server-3.10.5-1.el8.noarch.rpm
标题中的“rabbitmq-server-3.6.5-1.noarch.rar”指的是RabbitMQ服务器的一个特定版本,即3.6.5版本。RabbitMQ是一个开源的消息队列系统,基于AMQP(Advanced Message Queuing Protocol)协议,用于在分布式系统中...
rabbitmq-server-3.8.0-1.el6.noarch.rpm安装包下载 使用命令安装:yum -y install rabbitmq-server-3.6.6-1.el6.noarch.rpm 启动rabbitmq服务: 前台运行:rabbitmq-server start (用户关闭连接后,自动结束进程) ...
通过命令 brew install rabbitmq 安装时下载 rabbitmq-server-generic-unix-3.8.3.tar.xz 失败?当前文件可通过放入 ~/Library/Caches/Homebrew/downloads 目录下,再次运行命令即可安装成功!
在Windows环境下,RabbitMQ的安装通常通过下载对应的zip文件进行,例如"rabbitmq-server-windows-3.6.10.zip"。 这个压缩包文件包含的是RabbitMQ服务器的Windows版本,版本号为3.6.10。解压后,你可以找到一个名为...
这里提供了rabbitmq-server-3.7.3.exe百度网盘下载,官网下载实在是太慢了,亲测有效! rabbitmq-server-3.7.3.exe rabbitmq-server-3.7.3.exe rabbitmq-server-3.7.3.exe
最新版linux rabbitmq-server-generic-unix-3.8.5.tar.xz
这个压缩包“rabbitmq-server-mac-standalone-3.5.7.tar.gz”是专为MAC OS X操作系统设计的RabbitMQ服务器版本,支持10.6.4或更高版本。在本文中,我们将深入探讨RabbitMQ的核心概念、安装过程以及如何在MAC OS X上...
rabbitmq-server-3.13.7.exe