当前位置: 首页 > 知识库问答 >
问题:

后端 - 消费服务哪种结构,可以提高消费速度与效率?

蒋鹏鹍
2023-09-14

环境

springboot, rocketmq, nacos, feign

定义

  • [消费服务 A], rocketmq 消费服务, 触发任务处理
  • [数据服务 B], 本地数据库, 相关业务逻辑
  • [分析服务 C], 对接三方服务, 发送本地数据, 返回结果. 三方结果有同步, 有异步.

    流程

  • [消费服务 A]触发事件, [数据服务 B]提供数据, 状态更新. [分析服务 C]通过第三方处理数据, 返回结果写入[数据服务 B].

    关键因素

  • 一次任务,由[数据服务 B]提供任务数据列表(多条), [分析服务 C]因三方接口限制, 数据不能一次性发送给第三方, 需要多次发送. 总请求是 数据条数*n, [分析服务 C]处理一条数据总体时间长.
  • [消费服务 A]需要等待任务执行完, 确定是消费重试, 还是消费成功.

    迷惑

  • 结构 1 [消费服务 A]触发事件调用[数据服务 B], [数据服务 B]读取数据, 发送给[分析服务 C], [分析服务 C]处理数据, 返回结果给[分析服务 C]

([消费服务 A] -> [数据服务 B] -> [分析服务 C])

  • 结构 2 [消费服务 A]触发事件从[数据服务 B]拉取任务数据, [消费服务 A]将数据发送给[分析服务 C], [分析服务 C]将结果返回给[消费服务 A], [消费服务 A]将结果回写给[数据服务 B].

([消费服务 A] <-> [数据服务 B], [消费服务 A] <-> [分析服务 C], [消费服务 A] <-> [数据服务 B])

想法

  • 根据[数据服务 B]的数据列表, 开启线程, 并行处理, 提高[分析服务 C]处理速度.
  • 结构 1, 内聚强一点, 但需要处理[消费服务 A]的超时情况, 因为一个请求超过设定的时间, 会直接返回超时, 实际[数据服务 B]还在执行. 需考虑幂等性.可能上次任务还在执行,因为超时, [消费服务 A]再次触发任务.
  • 结构 2, [消费服务 A]通过在[数据服务 B]获取的数据(本地拉取数据快), 开启多线程, 调用[分析服务 C]处理数据,避免结构 1 中,一次请求等待超时问题.
  • 想让大家帮忙分析分析,有没有好的方案.

共有1个答案

曾阳飙
2023-09-14

推荐结构2,结构可以让消费服务A直接与数据服务B和分析服务C交互、并行处理数据服务B数据列表、还有用RocketMQ实现异步处理和解耦,来提高系统的内聚性、灵活性、可扩展性和稳定性。这个点来说结构的优势比较多

 类似资料:
  • 是否有一种方法以编程方式访问和打印使用者滞后偏移,或者说使用者读取的最后一条记录的偏移与某个生产者写入该使用者分区的最后一条记录的偏移之间的位置差。 要知道我的最终目标是将这个值发送到prometheus进行监视,我应该在上面添加哪些语句来得到滞后偏移值?

  • 我正在构建一个使用来自Kafka主题的消息并执行数据库更新任务的Kafka消费者应用程序。消息是每天一次大批量生产的--所以该主题在10分钟内加载了大约100万条消息。主题有8个分区。 Spring Kafka消费者(使用@KafKalistener注释并使用ConcurrentKafkaListenerContainerFactory)在非常短的批处理中被触发。 批处理大小有时仅为1或2条消息。

  • 我使用的是运行在AWS中的spark独立集群(spark and spark-streaming-kafka version 1.6.1),并对检查点目录使用S3桶,每个工作节点上没有调度延迟和足够的磁盘空间。 没有更改任何Kafka客户端初始化参数,非常肯定Kafka的结构没有更改: 也不明白为什么当直接使用者描述说时,我仍然需要在创建流上下文时使用检查点目录?

  • 本文向大家介绍Kafka 消费者是否可以消费指定分区消息?相关面试题,主要包含被问及Kafka 消费者是否可以消费指定分区消息?时的应答技巧和注意事项,需要的朋友参考一下 Kafa consumer消费消息时,向broker发出fetch请求去消费特定分区的消息,consumer指定消息在日志中的偏移量(offset),就可以消费从这个位置开始的消息,customer拥有了offset的控制权,可

  • 我花了几个小时想弄清楚发生了什么,但没能找到解决办法。 这是我在一台机器上的设置: 1名zookeeper跑步 我正在使用kafka控制台生成器插入消息。如果我检查复制偏移量(

  • 我有一个多分区主题,由多个使用者(同一组)使用。我的目标是最大化消费处理,即任何消费者都可以消费来自任何分区的消息。 我知道这看起来是不可能的,因为只有一个消费者可以从一个分区中消费。 有没有可能使用REST代理来实现这一点?例如,轮询所有代理消费者实例。 谢了。