MQ死信队列(延迟队列)
当一个队列中的消息满足下列情况之一时,可以成为死信(dead letter):
- 消费者使用basic.reject或 basic.nack声明消费失败,并且消息的requeue参数设置为false
- 消息是一个过期消息,超时无人消费
- 要投递的队列消息满了,无法投递
如果一个队列中的消息已经成为死信,并且这个队列通过dead-letter-exchange属性指定了一个交换机,那么队列中的死信就会投递到这个交换机中,而这个交换机就称为死信交换机(Dead Letter Exchange)。而此时加入有队列与死信交换机绑定,则最终死信就会被投递到这个队列中;这个队列称为 死信队列。
一般情况;都是对一个消息设置过期时间,然后再到时间之后接收消息,达到延迟处理的效果;这样的死信队列也被称为延迟队列。
如何防止消息重复消费
利用去重表来解决,每次接收到消息之后,先从去重表查询该消息是否已经消费,如果已经消费就不处理本来的业务,否则处理本来的业务并且往去重表添加一行消息去重记录。
如何解决消息解压问题
- 消息过多,消费者消费速度太慢。
- 多个消费者并发消费
- 多线程并发消费
- 设置消息存活时间(TTL) Time To Live
- 设置队列中存储消息的界限(Lim) limit
- 消费者消费失败,消息还在业务队列中。
- 再重试一次,如果还不行,扔到死信队列,避免队列阻塞。
RabbitMQ的消息模式
模式有常见的五种:
- 简单队列模式:一个生产者,一个消费者,一个消息被一个消费者接收;
- 工作队列模式:一个生产者,生产一个消息到一个队列中,多个消费者同时监听这个队列;消息被竞争消费。(默认平均,可配置为 能者多得)
- 交换机模式
- Fanout 广播模式:每个绑定到该类交换机的队列都能接收到消息,实现广播的效果
- Direct 定向模式:每个绑定到交换机的队列,还有一个路由key;发送的key与绑定同类key的队列才能接收到消息
- Topic 主题模式:每个绑定到交换机的队列,还有一个路由key;发送的key与绑定同类key的队列才能接收到消息;这个key可以使用通配符;*表示一个字符,#表示多个
elasticsearch正向索引
正向索引:以文档的ID为关键字,表中记录文档中每个字的位置信息,查找时扫描表中每个文档中字的信息直到找出所有包含查询关键字的文档
正向索引是最传统的,根据id索引的方式。但根据词条查询时,必须先逐条获取每个文档,然后判断文档中是否包含所需要的词条,是根据文档找词条的过程。