保证分布式 Java 应用程序中的请求处理

问题描述 投票:0回答:1

我需要您关于 Java 应用程序的建议。

我有一个应用程序分布在集群上 A 和外部应用程序 B、C、D 等,只有 ~ 50 个。 我的A中是客户请求的流量,总共15个TPS。 对于每个请求,我都会调用应用程序 B、C、D... 但应用程序 B 将速率限制器设置为等于 1 TPS,而应用程序 C 将速率限制器设置为等于 10 TPS。每个应用程序都有自己的TPS

任务是

  1. 保证处理来自客户的所有消息(如果应用程序崩溃,来自客户端的请求不应该“丢失”,但也必须被处理,它们被发送到相关应用程序)并且
  2. 控制传出速率限制器。

第 1 部分的实现有两种想法 - Kafka 或数据库。

如果你在Kafka中创建一个公共主题并从中读取消息,根据消息类型对相应的系统进行毒害,那么整个速度将减慢到应用程序B及其1 TPS的速度。

如果你为每个应用程序创建一个单独的主题 - 50 个生产者和 50 个消费者 - 会不会有太多的应用程序资源需要处理?

或数据库 - 写入一个表,其中包含每个应用程序和 50 个调度程序的类型?

告诉我,解决方案、最佳实践、应用示例是什么?

java postgresql spring-boot apache-kafka openshift
1个回答
0
投票

我过去处理过类似的设计任务。这是我的建议。使用数据库表来存储传入的请求而不是排队。在这种情况下,关系数据库比非 SQL 数据库更适合您。在您的请求表中填写以下字段:

  1. id
  2. 创造时间
  3. 更新时间
  4. 目的地 - 此请求应转发到哪个应用程序
  5. 重试计数
  6. 状态 - 应该像 ENUM (
    new
    ,
    in progress
    ,
    failed
    ,
    success
    ,
    ready for retry
    )
  • 现在在您的代码中创建一个管理器类,该类在单独的线程中检查表并查找所有正在等待处理的请求(新的或准备重试的请求)并将它们发送到适当的目的地。或者为每个目标应用程序创建一个管理器类,每个应用程序将仅扫描表以查找自己的目标请求并将它们发送到其目标。
  • 请求发送到发送目的地后,将其状态更改为
    in progress
    。请求完成后,将其状态更改为
    success
  • 有一个单独的看门狗类来检查所有
    in progress
    的请求,如果它们处于该状态的时间超过某个截止时间,则更改请求状态
    failed
  • 另一个 Retry 类将查找状态为
    failed
    的所有请求,并且如果重试计数低于最大重试次数(例如 3、4 或 5),则增加重试计数字段并将其状态更改为
    ready for retry

这是我设计的轮廓。效果非常好。我用这个设计实现的系统在生产中运行得非常可靠。

© www.soinside.com 2019 - 2024. All rights reserved.