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、日志监控(ELK8、下单、订单分发、抢票
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
247
粉丝
18
喜欢
217
收藏
62
排名:731
访问:9753
私信
所有博文
社区赞助商