最近在研究异步的消息机制,使用的是rabbit mq这个消息框架,使用Erlang开发,提供了java的jar包。
AMQP 里主要要说两个组件:Exchange 和 Queue (在 AMQP 1.0 里还会有变动),这两者都在 Server 端,又称作 Broker ,这部分是 RabbitMQ 实现的。客户端,通常有 Producer 和 Consumer 两种类型。
通常的操作流程是:
(1) 消费者: 创建信息通道。
(2) 消费者: 定义消息队列。
(3) 消费者: 定义特定类型的交换机。
(4) 消费者: 设定绑定规则 (包括交换机名称、队列名称以及路由键)。
(5) 消费者: 等待消息。
(6) 生产者: 创建消息。
(7) 生产者: 将消息投递给信息通道 (注明接收交换机名称和路由键)。
(8) 交换机: 获取消息,依据交换机类型决定是否匹配路由规则 (如需匹配,则对比消息路由键和绑定路由键)。
(9) 消费者: 获取并处理消息,发送反馈。
(10) 结束: 关闭通道和连接。
队列定义参数:
durable: 是否持久,如果是true,则在服务重启之后还是存在,否则不存在
exclusive: 仅创建者可以使用的私有队列,断开后自动删除。(如果为true则只有创建者线程才可以使用,如果线程停止则queue也会自动删除)
auto_delete: 当所有消费客户端连接断开后,是否自动删除队列。
交换机定义参数:
type: 交换机类型,包括 fanout, direct 和 topic。
auto_delete: 当所有绑定队列都不再使用时,是否自动删除该交换机。
交换机类型:
Fanout: 不处理路由键,将消息广播给绑定到该交换机的所有队列。 不论消息的路由关键字是什么,这条消息都会被路由到所有与该交换器绑定的队列中。
广播式交换器类型的工作方式如下:
不使用任何参数将消息队列与交换器绑定在一起。 发布者(直接式交换器类型描述中的producer变成了publisher,已经隐含了二种交换器类型的区别)向交换器发送一条消息。 消息被无条件的传递到所有和这个交换器绑定的消息队列中。
Direct: 处理路由键,对消息路径进行全文匹配。消息路由键 "dog" 只能匹配 "dog" 绑定,不匹配 "dog.puppy" 这类绑定。
通过精确匹配消息的路由关键字,将消息路由到零个或者多个队列中,绑定关键字用来将队列和交换器绑定到一起。这让我们可以构建经典的点对点队列消息传输模型,不过和任何已定义的交换器类型一样,当消息的路由关键字与多个绑定关键字匹配时,消息可能会被发送到多个队列中。
Topic: 处理路由键,按模式匹配路由键。模式符号 "#" 表示一个或多个单词,"*" 仅匹配一个单词。如 "audit.#" 可匹配 "audit.irs.corporate",但 "audit.*" 只匹配 "audit.irs"。
主题式交换器类型提供了这样的路由机制:通过消息的路由关键字和绑定关键字的模式匹配,将消息路由到被绑定的队列中。这种路由器类型可以被用来支持经典的发布/订阅消息传输模型——使用主题名字空间作为消息寻址模式,将消息传递给那些部分或者全部匹配主题模式的多个消费者。
主题交换器类型的工作方式如下:
绑定关键字用零个或多个标记构成,每一个标记之间用“.”字符分隔。绑定关键字必须用这种形式明确说明,并支持通配符:“*”匹配一个词组,“#”零个或多个词组。
因此绑定关键字“*.stock.#”匹配路由关键字“usd.stock”和“eur.stock.db”,但是不匹配“stock.nasdaq”。
这种交换器类型是可选的。
生产者无需定义队列、交换机和绑定,只需将消息投递给信息通道即可。
如果定义一durable的queue,那么bind此queue的exchange也必须是durable的
定义用户权限
set_permissions [-p vhostpath] [-s scope] {user} {conf} {write} {read}
vhostpath
The name of the virtual host to which to grant the user access, defaulting to /.
scope
Scope of the permissions: either client (the default) or all. This determines whether permissions are checked for server-generated resource names (all) or only for client-specified resource names (client).
user
The name of the user to grant access to the specified virtual host.
conf
A regular expression matching resource names for which the user is granted configure permissions.
write
A regular expression matching resource names for which the user is granted write permissions.
read
A regular expression matching resource names for which the user is granted read permissions.
Sets user permissions.
For example:
rabbitmqctl set_permissions -p /myvhost tonyg "^tonyg-.*" ".*" ".*"This command instructs the RabbitMQ broker to grant the user named tonyg access to the virtual host called /myvhost, with configure permissions on all resources whose names starts with "tonyg-", and write and read permissions on all resources.
spring AMQP 中的SimpleMessageListenerContainer 是spring封装好了的,有一系列bean初始化的动作包含在内,目前的用例中因为需要通过程序动态置入queue就直接调用start方法,看了下spring的源码,他是在bean初始化的时候调用的。
目前关于rabbit mq的中文教程很少,刚接触的时候只是看官方上的文档,和官方提供的示例。因为是用Spring-amqp来做的,所以基本上看spring-amqp的时间多一点,提供了一个简单的hello world和复杂的stock例子,先结合api看hello world的例子,再看spring amqp的reference 感觉就可以入门了,当然之前对amqp的概念要熟悉。感觉rabbit的文档真是比较少特别是java的接口方面,花了很多时间死啃那些文档。
分享到:
相关推荐
Custom-message-queue-ajax-httpClient 消息队列,使用环形队列,异步发送httpClient,在并发量不是很大的情况下可以不使用服务器去部署消息队列例如Rabbit MQ
mq.rar springcloud对接rabbit java工程 RabbitMQ是一种消息中间件,用于处理来自客户端的异步消息。服务端将要发送的消息放入到队列池中。接收端可以根据RabbitMQ配置的转发机制接收服务端发来的消息。 RabbitMQ...
基于SpringBoot+RabbitMQ用户注册实现异步发送验证码源码。基于SpringBoot+RabbitMQ用户注册实现异步发送验证码源码。基于SpringBoot+RabbitMQ用户注册实现异步发送验证码源码。...基于SpringBoot+Rabbit
RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用。
(二)、python操作rabbit mq rabbitmq配置安装基本使用参见上节文章,不再复述。 若想使用python操作rabbitmq,需安装pika模块,直接pip安装: pip install pika 1.最简单的rabbitmq producer端与consumer端对话: ...
你会使用Spring AMQP的RabbitTemplate内置应用系统来发布消息和使用一个MessageListenerAdapter POJO来订阅消息 git克隆 gradle bootRun 需要 大约几十分钟 一款文本编辑器或者IDE 你也可以从这个项目中入门代码...
> RabbitMQ严格的遵循AMQP协议,高级消息队列协议,帮助我们在进程之间传递异步消息。 > RabbitMQ是用Erlang实现的一个高并发高可靠AMQP消息队列服务器。支持消息的持久化、事务、拥塞控制、负载均衡等特性,...
消息中间件主要是实现分布式系统中解耦、异步消息、流量销锋、日志处理等场景,后面我也会结合一些场景进行探讨。现在生产中用的最多的消息队列有Activemq,rabbitmq,kafka,rocketmq等。分布式消息队列学习必备
docker run redis # Rabbit MQ coming soon... 用法 from pytask_io import PyTaskIO # Starts the task runner pytask = PytaskIO ( store_port = 6379 , store_host = "localhost" , db = 0 , workers = ...
Spring微服务-V2 我们最受欢迎的课程的V2-微服务+ Spring Cloud + Docker + Kubernetes 了解如何使用Spring和Spring Boot创建很棒的微服务和RESTful Web...使用Rabbit MQ的异步通信 带有Spring Cloud-V2的微服务 步骤
导入里面的sql,也就是一个user表,...异步调用mq时候消费者必须返回void 可以在消息适配器MessageListenerAdapter里配置队列和方法的映射queueOrTagToMethodName,指定哪个队列调用消费者哪个方法,同步的需要有返回值
确保 Rabbit MQ 已安装并正在运行。 该应用程序使用 RabbitMQ 创建一个异步请求,该请求可以被处理和扩展到 Web Rest 接口的能力之外。 从命令行: mvn clean install -- 构建应用程序mvn spring-boot:run调用闯入...
之后会将学到的知识深入的实战到实际的各种应用场景中,从而加深知识点的理解,其中包括如何实现单一队列多个消费者监听消费、业务服务模块解耦通信、抢单高并发方案的解决、登录成功异步写日志、异步发送邮件、死信...