RabbitMq
为什么中间件能够削封
串行执行:是所有操作都一次执行最终完成时间所有流程时间总和
并行执行:将各部操作由多线程并行操作,各步骤完成时间最长为单步最长时间
中间件进行削峰主要是,消息中间件能够将大量并发的消息存到自己的消息队列中,然后快速稳定的让消费方进行消费处理
消息中心协议(amqp)
各种中间件必须遵守的一种规范TCP/UDP
1.长链接
2.分布式事务支持
3.消息持久化
4.高性能和高可靠
消息中心的消息分发策略
1.发布订阅:队列中有100条消息,没有个订阅的消费者都能够收到100条消息
2.轮询分发:队列中有100条消息,会轮询依次送给三个消费者消费,没各消费者最少33条,剩下一条随机分给一个消费者
3.公平分发:队列中有100条消息,会根据消费者的性能进行分发,性能强的消费者就能够消费更多的消息,会造成消息的倾斜
4.重发:如果发送给消费者的消息没有的到消费相应,则会重新发送该消息给其他消费者
集群
1.主从同步(消息同步)
2.主从共享(消息共享)
3.多主多从
4.多主集群转发部署(元数据共享)
消息的工作流程
1.创建连接
2.创建通道
3.创建交换机
4.创建队列
5.将消息通过交换机推送到队列
5.队列通过routeKey进行消息分发给消费者
交换机工作模式
fanout
绑定的全部队列都会收到消息
direct
在fanout的基础上为每个队列添加了路由key,交换机发送消息是需要带上路由key,指定路由key的队列才会接收到消息
topic
在direct基础上添加了模糊匹配
*一级匹配,必须有一级
#多级匹配
Headers
配置参数模式
用代码方式实现连接、通道获取、队列创建、交换机创建、队列绑定交换机、消息发送、消息消费
连接
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("localhost");
connectionFactory.setPort(5672);
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
connectionFactory.setVirtualHost("/");
connection = connectionFactory.newConnection("生产者");
通道获取
channel = connection.createChannel();
队列创建
channel.queueDeclare(queueName,true,false,false,null);
交换机创建
channel.exchangeDeclare(exchangeName,type,true);
队列与交换机的绑定
channel.queueBind(queueName,exchangeName,routeKey);
向交换机推送消息
channel.basicPublish(exchangeName,routeKey,null,message.getBytes());
消费消息
channel.basicConsume(queueName, true, new DeliverCallback() {
@Override
public void handle(String s, Delivery delivery) throws IOException {
System.out.println(queueName+"收到的消息:"+new String(delivery.getBody(),"UTF-8"));
}
}, new CancelCallback() {
@Override
public void handle(String s) throws IOException {
}
});