中间件
RocketMQ
如何保证消息不丢失
1. 从Producer分析:如何确保消息正确的发送到了Broker?
通过发送状态和日志
2. 从Broker分析:如果确保接收到的消息不会丢失?
通过日志分析
3. 从Cunmser分析:如何确保拉取到的消息被成功消费?
Consumer自身维护一个持久化的offset(对应MessageQueue里面的min offset),标记已经成功消费或者已经成功发回到broker的消息下标
a. 如果Consumer消费失败,那么它会把这个消息发回给Broker,发回成功后,再更新自己的offset
b. 如果Consumer消费失败,发回给broker时,broker挂掉了,那么Consumer会定时重试这个操作
c. 如果Consumer和broker一起挂了,消息也不会丢失,因为consumer 里面的offset是定时持久化的,重启之后,继续拉取offset之前的消息到本地
消费积压
1. 通过delay数和上次消费时间确定是否积压
2. 查看下游消费者是否挂了,如果挂了重新启动消费
3. 如果是消费能力问题需要考虑横向扩容
4. 查看消费日志是不是下游服务出现挂了或者延迟
顺序消费原理
produce在发送消息的时候,把消息发到同一个队列(queue)中,消费者注册消息监听器为MessageListenerOrderly,这样就可以保证消费端只有一个线程去消费消息
注意:是把把消息发到同一个队列(queue),不是同一个topic,默认情况下一个topic包括4个queue
如何解决重复消费
1. 保证幂等性
2. 生产端幂等会带来两个问题:接口性能、如果用Redis可能Redis宕机导致出问题
3. 因此在消费端做幂等,消费时候数据库判断是否已经消费过消息
与RabbitMQ区别
RocketMQ使用JMS的API,只能用java,RabbitMQ使用AMQP协议,不限语言
ElasticSearch分词器:
1. Standard Analyzer 默认分词器
2. Simple Analyzer 按照非字母切分
3. Whitespace Analyzer 空白字符作为分隔符
4. Stop Analyzer 相比Simple Analyzer多了去除请用词处理
5. Keyword Analyzer 不分词,直接将输入作为一个单词输出
6. Pattern Analyzer 通过正则表达式自定义分隔符
7. Language Analyzer 提供了30+种常见语言的分词器
浙公网安备 33010602011771号