RabbitMQ 使用场景

Java
446
0
0
2022-04-14
标签   RabbitMQ

1.1 同步异步问题(串行)

串行方式:将订单信息写入数据库成功后,发送注册邮件,再发送短信。以上三个任务全部完成后,返回给客户端。

public void makrOrder() {
    // 1.订单保存
    orderService.saveOrder();
    // 2.发送短信服务
    messageService.sendSMS("order");
    // 3.发送email服务
    emailService.sendEmail("order");
    // 4.发送 APP 服务
    appService.sendApp("order");
}

1.2 并行方式 异步线程池

并行方式:将订单信息写入数据库成功后,发送注册邮件的同时,发送注册短信。以上三个任务完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间。

缺点:需要自己维护线程池、持久性、高可用,高可用都需要自己实现,最重要的是耦合在应用程序中。
public void makeOrder() {
    // 1.保存订单
    orderService.saveOrder();
    // 发送  
    relationMessage();
}

public void relationMessage() {
    // 异步
    threadpool.submit(new Callable<Object>{
        public Object call() {
            // 发送短信服务
            messageService.sendSMS("order");
        }
    });
    // 异步
    threadpool.submit(new Callable<Object>{
        public Object call() {
            // 发送email服务
            messageService.sendEmail("order");
        }
    });
    // 异步
    threadpool.submit(new Callable<Object>{
        public Object call() {
            // 发送email服务
            messageService.sendApp("order");
        }
    });
}

1.3 异步消息队列

完全解耦,用 MQ 建立桥梁

有独立的线程池和运行模块

出现了消息坑会丢失,MQ 有持久化功能

如何保证消息的可靠性,死信队列和消息转移等

如果服务器承载不了,需要自己去写高可用,HA 镜像模型高可用

public void makeOrder() {
    orderService.saveOrder();
    rabbitTemplate.convertSend("ex","2","消息内容");
}

2、高内聚,低耦合

3、流量的削峰

4、分布式事务的可好消费和可靠生产

5、索引、缓存、静态化处理的数据同步

6、流量监控

7、日志监控(ELK)

8、下单、订单分发、抢票