关于rabbitmq中的类型交换
今天才刚开始接触rabbit,记录一下自己写的代码
exchange有4中类型:
直接交换中心:(Direct exchange)
扇形交换中心:(Fanout exchange)
主题交换中心:(Topic exchange)
首部交换中心:(Headers exchange)
第一种直接交换中心
直接交换中心是一个带路由功能的exchange,一个队列会和一个exchange绑定,除此之外再绑定一个routing_Key,当消息被发送的时候,需要指定一个routing_Key,这个消息被送到exchange的时候,就会被exchange送到指定的队列里面去。
适用场景:有优先级的任务
第二种 扇形交换中心也叫做广播交换中心
扇形交换中心会把能接收到的消息全部发送给绑定在自己身上的队列
第三种 主题交换中心
跟直接交换类似,主题交换中心是用一定的规则去匹配相应的队列
规则
topic消息类型不能是任意的routing key, 必须是有点"."组成的单词列表。
注意可以用*号和#号出现,和我们日常用的正则表达式含义相近
"*"号代表任意一个单词
"#"号代表0个或多个单词
第四种 首部交换中心
首部交换中心是忽略routing_key的一种路由方式。路由器和交换中心的路由规则是通过Headers信息来交换的。将一个exchange声明为首部exchange,绑定一个队列的时候,定义一个Hash的数据结构,消息发送的时候,会携带一组hash数据结构的信息,当Hash的内容匹配上的时候,消息就会被写入队列。但是Hash结构中需要携带键值x-match” 值为all或者any。
一个简单的广播方式实现,当为扇形广播的时候,交换机为""
bool IsFanout = false;//广播方式
if (exchange_type == ExchangeType.Fanout)
{
//广播方式
IsFanout = true;
EXCHANGE_NAME = EXCHANGE_NAME ?? "mst_exchange_fanout";
}
else
{
EXCHANGE_NAME = EXCHANGE_NAME ?? "mst_exchange_topic";
exchange_type = ExchangeType.Topic;
}
channel.ExchangeDeclare(exchange: EXCHANGE_NAME, type: exchange_type);
channel.QueueBind(routingKey, EXCHANGE_NAME, IsFanout? EXCHANGE_NAME:"");