rabbitmq笔记 与 springcloudstream的交互

消费者生产者模式,基于amqp协议。

服务与rabbitmq的amqp连接基于tcp,通过信道来传递消息

消息由标签和荷载两部分组成,标签包括路由的信息,真正的消息在荷载上。


关于队列

消息最终会发送到队列上,队列上的消息被订阅他的服务消费,当一个队列拥有多个消费者时,消息会轮询发送到每一个服务(若发送到a失败会继续发送给b)

队列接收到消息后会回复一个ack,证明他已经接收到消息。如果rabbitmq在收到ack之前不会再向他发送消息


关于绑定exchange

三种常用exchange direct, fanout, topic

每个rabbit都有一个默认的direct exchange,名字为空字符串,声明一个队列后他会自动绑定到这个exchange上。路由键为队列名。

direct exchange 会根据发送到他的信息的绑定键,将信息发送到对应的队列上

fanout     发送到fanout exchange上的消息会被广播到所有绑定到这个exchange上的队列

topic   按照topic分发   1. 首先将队列a绑定到exchange b上并设置绑定键, 例如*.topic.    2.发送一个消息到exchange b上,路由键为ccc.topic, 则消息会被发送到队列a上。

           以此类推,若存在一个队列d,绑定到b上,绑定键为ccc.*, 则消息也会发送到队列d上。

           队列的绑定键还可以为#,代表任何路由键都会发送消息到此队列


vhost  一个rabbitmq可以设置多个vhost。默认为/ 。  不同的vhost下可以创建exchange和queue,可重名。 还可以设置不同的权限。不同的服务可以使用不同的vhost的mq


插件api文档地址  : https://rawcdn.githack.com/rabbitmq/rabbitmq-management/rabbitmq_v3_6_10/priv/www/api/index.html


插件warren:可用于主/从 集群, 主集群宕机后备用集群启用,但是备用集群无法同步主集群的消息,主集群恢复后,旧消息继续发送

插件shovel:可用于将消息从转移,可以是从同一个mq的一个队列转移到另一个队列,也可以从一个mq转移到另一个mq(queue,exchange)

http://www.rabbitmq.com/shovel-dynamic.html

(死信从死信队列移动到正常队列)



关于集群

节点储存数据:1.队列元数据  2.交换器元数据 3.绑定元数据  4.vhost元数据

在集群中,队列元数据只存储在一个节点上,其他节点只存储队列指针

交换器实际上只是一个转发信息列表,并且所有节点都同步该表

节点分为两种,内存节点和磁盘机电,每个集群至少有一个磁盘节点,磁盘节点退出时必须至少通知一个磁盘节点。如果唯一的磁盘节点崩溃了,那集群无法做更改集群信息的动作,但是可以继续路由。添加和删除节点操作需要所有的磁盘节点都在线。

本机配置集群:创建几个节点,并将他们统一加入到一个集群中。



SpringCloudSteam

简书例子:http://www.jianshu.com/p/fb7d11c7f798

spring社区文档: https://docs.spring.io/spring-cloud-stream/docs/Chelsea.SR2/reference/htmlsingle/index.html#consumer-groups


springcloudsteam将消息中间件与服务隔离,在中间添加了一个中间层,让研发人员可以无感知的运用消息中间件。

服务通过input和output channel与rabbitmq交互。

springcloudsteam提供的binder将channel与rabbitmq的exchanger(output) / queue(input) 绑定。

对应关系:   发布端:output channel -> topic exchange    消费端 : input channel -> topic exchange    group -> queue 

                    routine key : #           

发布端通过一个output channel 所发布的信息会到达rabbitmq 的topic exchange, 由于routine key是 #, 消息会被转发到所有订阅到这个exchange上的queue

queue的创建: 在消费端app的配置文件中添加spring.cloud.stream.bindings.<channel>.group = XXX   显示创建的队列是持久化的,默认创建的是临时的

每一个绑定到该channel(及exchange)的group对应一个队列,若显示的创建,则会自动创建一个队列,使用默认名称。

app: @EnableBinding(X.class)来激活事先定义好的接口,接口中会声明channel

           @StreamListener('xx')声明这个方法会监听来自于xx channel的信息,即xx exchange转发到queue的信息。 具体监听哪个queue在配置文件中配置


对比:发布消息由原先创建exchange,将消息发布到exchange上  变为   创建output channel,消息通过channel直接发布。 exchange和routine key被自动创建

           接收消息由原来的创建队列,绑定队列,监听队列  变为   创建input channel, 创建channel对应的group, 监听channel。  队列被自动创建,监听的队列在配置文件中














  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值