中间件

    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+种常见语言的分词器

posted on 2022-02-03 21:14  xiao_xin  阅读(44)  评论(0)    收藏  举报

导航