中间件

作者: go_2021 | 来源:发表于2022-02-17 22:00 被阅读0次

    中间件

    解决系统之间调用问题,a到b调用,改为多下游,就要改a项目,解耦。
    上游发给下游数据,上游得等待下游返回,要是下游反应比较慢,这会消耗上游的资源,上游直接给中间件发,以后的事儿中间件负责,失败重试功能,还有削峰填谷。

    选型

    activeMQ和rabbitMQ单机吞吐量万级,rocketMq和kafka是10w级。
    activeMQ会丢数据,社区不活跃。rabbitMq,scala开发,时效性比较强。

    • 现在选型基本是在rocketMQ和kafka中选择,kafka业内标准,社区活跃。rocketMQ可以阿里云买服务直接用。
    • zk和nameserver cp和ap。
    • 下游消费,kafka是拉,rocketMQ是推,推的多了下游收不了。

    kafka

    副本保证高可用,分片保证吞吐性能。依赖zk。

    • 消息丢失

      • 上游发消息
        发送kafka失败,设置retries参数,设置重试次数。ack 0 直接返回。 1 主节点写完返回。all主节点返回,并同步到副本后返回。
      • 下游接受
        关闭自动offset,处理完业务在手动提交。
    • 幂等,重复消费
      唯一索引,或者事务加锁。

    • 消息有序
      topic同key,固定分片。
      下游逻辑:mysql事务加锁,redis锁,单线程池。

    • 数据保留策略
      过期时间,存储大小。

    • 队列挤压
      下游consumer导致,先恢复consumer,停止kafka。紧急扩容,扩容分片,队列,开启kafka,跑完,恢复。

    • 高性能
      架构,主题分片实现高可用。
      日志,格式随着版本越来越利用批量处理,顺序写+写入系统页缓存保证写入效率。
      数据,会对传递的数据进行压缩。
      请求数,发送端分为两个线程一个做缓存一个做发送,会进行请求合并发送。
      对象复制,读用MappedBuffer减少用户态和内核态数据复制。写用FileChannel.transTo减少数据复制。

    rockmq

    保证数据发送到mq不丢失。
    mq有half消息机制,客户端向mq发送消息会先发一个half消息,mq接受到half消息后放进入一个half队列里,返回ack。这时候客户端再处理自己的数据,执行完会再和mq发通知,是执行还是回滚。如果是执行,mq会把half队列的数据标记为执行,把数据放到正常的mq队列中,通知下游,如果是回滚,mq会把half队列里这个数据标记为删除。如果上游没有及时通知mq怎么处理half,mq会有在超时过后,定期的去向上游发消息确认怎么处理,如果发了15次,都没有反馈,就执行删除。
    社区活跃,微信群,钉钉群方便沟通,java语言开发对java开发友好。
    链路追踪,监控,权限控制都原生支持。topic过多不会影响到性能。不依赖zk。可靠性方面,kafka是异步刷盘,rock支持异步和同步,灵活使用。

    相关文章

      网友评论

          本文标题:中间件

          本文链接:https://www.haomeiwen.com/subject/rqhslrtx.html