RabbitMQ
1.RabbitMQ常用的交换器类型有direct、topic、fanout、headers四种。
1.1 Direct Exchange直接
该类型的交换器将所有发送到该交换器的消息被转发到RoutingKey指定的队列中,也就是说路由到BindingKey和RoutingKey完全匹配的队列中。
1.2 Topic Exchange 主题
该类型的交换器将所有发送到Topic Exchange的消息被转发到所有RoutingKey中指定的Topic的队列上面。
Exchange将RoutingKey和某Topic进行模糊匹配,其中“”用来匹配一个词,“#”用于匹配一个或者多个词。例如“com.#”能匹配到“com.rabbitmq.oa”和“com.rabbitmq”;而"login."只能匹配到“com.rabbitmq”。
1.3 Fanout Exchange 扇形分叉
该类型不处理路由键,会把所有发送到交换器的消息路由到所有绑定的队列中。优点是转发消息最快,性能最好(一发多收)
1.4 Headers Exchange
该类型的交换器不依赖路由规则来路由消息,而是根据消息内容中的headers属性进行匹配。headers类型交换器性能差,在实际中并不常用。
2.消息生产者确认:
开启事务机制
channel.TxSelect(); //事务是协议支持的
channel.TxCommit(); //只有事务提交成功以后,才会真正的写入到队列里面去
channel.TxRollback(); //事务回滚
//开启消息异步确认模式
channel.ConfirmSelect();
if (channel.WaitForConfirms()) //如果一条消息或多消息都确认发送
channel.WaitForConfirmsOrDie();//如果所有消息发送成功 就正常执行;如果有消息发送失败;就抛出异常;
3.消息消费者确认消息:
autoAck: true 自动确认;
channel.BasicConsume(queue: "ConsumptionACKConfirmQueue", autoAck: true, consumer: consumer);
手动确认 消息正常消费 告诉Broker:你可以把当前这条消息删除掉了
channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
否定:告诉Broker,这个消息我没有正常消费; requeue: true:重新写入到队列里去; false:你还是删除掉;
channel.BasicReject(deliveryTag: ea.DeliveryTag, requeue: true);
4.设置消息优先级最高 重新写入到队列中去,消息持久化需要将交换机持久化、队列持久化、消息持久化,才能最终达到持久化的目的
IBasicProperties props = channel.CreateBasicProperties();
props.Priority = 9; //0-9数值越大优先级越高
props.DeliveryMode = 2;//2=消息持久化模式;1=默认不持久化
5.rabbitmq集群:
普通集群:只同步了数据结构,没有同步元数据,真实获取数据还要到存储数据的节点上去数据;没有做到高可用,高并发;
消息队列集群:同步了数据结构和元数据,一个节点失败,不影响系统正常发送消息,接收消息;
由于Erlang节点间通过认证Erlang cookie的方式来允许互相通信,所以个节点RABBITMQ_ERLANG_COOKIE必须设置为相同的