1.为什么要使用消息中间件?
生产能力远大于消费能力,如支付,支付的请求比较多,但是处理速度很慢,服务器中如果Http请求不能及时处理会消耗内存暂存请求慢慢处理,进而导致内存崩盘,从而我们希望有一个类似队列东西装载请求,能处理请求过多的情况,于是引入中间件
2.引入中间工具带来的问题
中间工具分割开了原本100%可靠请求流程,例如:A-->B(RPC或者直连都能实现可靠通信),现在变成了A-->C-->B, C不可靠(宕机,数据传输丢失),怎么保证 A100%到C,而B接收到C的数据又100%能消费到:
投递消息确认模式实现了 A 100% 把消息投递到了C 且C能实现了持久化,此时A能收到C的投递回执,即A-->C 100%可靠
C-->B,B主动去拉取C,C实现了消息消费确认机制,于是B拉取消息,且实现了逻辑后可以设置消费确认,告诉C:B已处理了消息,思考:如果B业务流程是 :操作数据库->消费回执,数据库操作完后回执不一定能执行到,此时消息还在消费队列中,即存在消息重复消费性;
引入以下问题:
1).消息投递100%可达性 (投递确认策略已解决)
2).重复消费(业务接口幂等性or事务锁)
3).中间件高可用问题 (集群)
4).中间件容灾恢复能力 (持久化数据文件恢复)
下篇再详细介绍
3.RabbitMQ 5中工作模式
rabbitmq的抽象交换机实现有5中
交换机构造器
构造器参数详解
Exchange.DeclareOk exchangeDeclare(
String exchange, //交换机name
BuiltinExchangeType type, //交换机类型详见以下五种
boolean durable, //数据持久化?
boolean autoDelete,//自动删除?当交换机无绑定队列时自动删除?
boolean internal, //是否内部交换机,是则客户端不能push消息,默认false外部交换机。
Map<String, Object> arguments //扩展参数
) throws IOException;
CustomExchange,DirectExchange,FanoutExchange,HeadersExchange,TopicExchange
五种使用教程可以参考 https://www.jianshu.com/p/7e574d4946e8
今天码到这。。。。