乐优商城day14(RabbitMQ实现数据同步)

所有代码发布在 [https://github.com/hades0525/leyou]

RabbitMQ五种消息模型

  1. 基本消息模型
    在这里插入图片描述
    在上图的模型中,有以下概念:
    • P:生产者,也就是要发送消息的程序
    • C:消费者:消息的接受者,会一直等待消息到来。
    • queue:消息队列,图中红色部分。类似一个邮箱,可以缓存消息;生产者向其中投递消息,消费者从其中取出消息。
    • 消费者消息确认机制(Acknowlege)
    • 消息一旦被消费者接收,队列中的消息就会被删除。
    那么问题来了:RabbitMQ怎么知道消息被接收了呢?
    这就要通过消息确认机制(Acknowlege)来实现了。当消费者获取消息后,会向RabbitMQ发送回执ACK,告知消息已经被接收。不过这种回执ACK分两种情况:
    • 自动ACK:消息一旦被接收,消费者自动发送ACK
    • 手动ACK:消息接收后,不会发送ACK,需要手动调用
    • 生产者
privatefinalstaticStringQUEUE_NAME="simple_queue";
 
publicstaticvoidmain(String[]argv)throwsException{
//获取到连接
Connectionconnection=ConnectionUtil.getConnection();
//从连接中创建通道,使用通道才能完成消息相关的操作
Channelchannel=connection.createChannel();
//声明(创建)队列
channel.queueDeclare(QUEUE_NAME,false,false,false,null);
//消息内容
Stringmessage="HelloWorld!";
//向指定的队列中发送消息
channel.basicPublish("",QUEUE_NAME,null,message.getBytes());
 
System.out.println("[x]Sent'"+message+"'");
 
//关闭通道和连接
channel.close();
connection.close();
}

• 消费者

private final static String QUEUE_NAME="simple_queue";
 
public static void main(String[]argv) throws Exception{
//获取到连接
Connection connection=ConnectionUtil.getConnection();
//创建通道
final Channel channel=connection.createChannel();
//声明队列
channel.queueDeclare(QUEUE_NAME,false,false,false,null);
//定义队列的消费者
DefaultConsumer consumer=new DefaultConsumer(channel){
//获取消息,并且处理,这个方法类似事件监听,如果有消息的时候,会被自动调用
@Override
public void handleDelivery(String consumerTag,Envelope envelope, BasicProperties properties,byte[]body ) throws IOException{
//body即消息体
String msg=new String(body);
//异常
System.out.println(1/0);
System.out.println("[x]received:"+msg+"!");
//手动进行ACK
channel.basicAck(envelope.getDeliveryTag(),false);
}
};
//监听队列,第二个参数false,手动进行ACK
//手动进行ACK,消息不会丢失
channel.basicConsume(QUEUE_NAME,false,consumer);
}
  1. work消息模型
    在这里插入图片描述

• 当消息处理比较耗时的时候,可能生产消息的速度会远远大于消息的消费速度。长此以往,消息就会堆积越来越多,无法及时处理。此时就可以使用work 模型:让多个消费者绑定到一个队列,共同消费队列中的消息。队列中的消息一旦消费,就会消失,因此任务是不会被重复执行的。
• 能者多劳
• 消费者1比消费者2的效率要低,一次任务的耗时较长
• 然而两人最终消费的消息数量是一样的
• 消费者2大量时间处于空闲状态,消费者1一直忙碌
现在的状态属于是把任务平均分配,正确的做法应该是消费越快的人,消费的越多。
• 让消费者同一时间只接收一条消息,这样处理完成之前,就不会接收更多消息,就可以让处理快的人,接收更多消息
• 生产者

privatefinalstaticStringQUEUE_NAME="test_work_queue";
 
publicstaticvoidmain(String[]argv)throwsException{
//获取到连接
Connectionconnection=ConnectionUtil.getConnection();
//获取通道
Channelcha
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值