系统调用外部慢响应的最佳架构 API
Best architecture for a system calling external slow response API
我想就所面临的问题请求一些指导和建议。
这是系统的结构:
- 客户端桌面应用程序
- 网络Api 1
- 网络Api 2
桌面客户端调用(HttpPost) => Web API 1 (HttpPost) => Web API 2
Web API 1 是内部的,我们可以 control/update 它。
Web API 2 是外部的,我们不能 update/improve 它。
客户端桌面应用程序每天发送大量 JSON 格式的数据和数百个请求。发送和接收数据以填充客户端桌面范围内的本地数据库。
我们的瓶颈在Web API 2 ,速度很慢,每次发送请求都需要很长时间才能完成。所以通常情况下,Web API 1 会超时,桌面客户端也会超时并一直加载。有时这个过程可能需要几天时间。
客户端桌面正在通过 HttpClient 调用 Web API 1.
我在那里看到的方法是在 Web Api 1 级别创建一个中间 DB/table,它存储应该发送到 Web API 2 的数据。我们将从桌面客户端接收此数据,然后立即将其存储在数据库中。然后 process/scheduled 作业可以 运行 读取这个中间的新记录 DB/Table 并将数据发送到 Web API 2. 这个过程可以在超时或存储的情况下执行重试逻辑每个请求的数据以提供报告以查看进度和错误数量。
在这种情况下,表结构可能类似于 Job(JobId/Progress/Status) => Data Items (Data/AddedDate/Status/ErrorMessage)
在流程中添加这个中间数据库对您来说有意义吗?
您会推荐其他以性能为导向的选项来解决这种情况吗?比如Queues,Cache,No-SQL存储?
任何建议或体系结构指南将不胜感激,我不是架构师或专家,但我想确定可以采取哪些道路和方法。我认为这是处理高数据量的数据系统中的常见问题。
您对架构的想法是一个很好的起点。
客户端 <-> 内部 WebApi
因此,当客户端向内部 WebAPI 发送请求时,应将其视为 “摄取服务”。它接受请求,将其存储在中间持久存储中并向客户端确认该事实。
HTTP Status Code 202 (Accepted) 通常用于请求收到、接受但 未 处理的这些情况。
响应可以(非强制性)包含请求的标识符。这可用于检索处理状态:
- 内部 WebApi 可能公开 GET 端点(如
/{id}/status
)
- 客户端可以根据用户需求发出请求,也可以long-poll在后台发出请求
- 或者您可以在客户端和内部 WebApi 之间使用 WebSocket,这样服务就可以通知客户端请求状态的变化
内部 WebApi <-> 外部 WebApi
正如所说,内部 WebApi 充当摄取服务。它有一个本地(如果是高可用性复制的)存储。如果你想拥有强大的解决方案(这样挂起的请求可以在服务崩溃后幸存下来)那么存储应该是持久的而不是短暂的。
存储的选择取决于很多因素,例如
- 负载大小,
- 保留政策,
- 请求排序
- 消费者数量
- 等等
因此,在不了解确切需求和情况的情况下,不可能提出好的解决方案。
这里我想强调一件关于重试的事情。不要盲目地为任何请求应用重试逻辑。为了执行重试逻辑,应满足以下先决条件:
- 潜在引入的可观察影响是可以接受的
- 可以重做操作,没有任何不可逆的副作用
- 与承诺的可靠性相比,引入的复杂性可以忽略不计
有关详细信息,请查看 my article regarding retry policy in general。
我想就所面临的问题请求一些指导和建议。 这是系统的结构:
- 客户端桌面应用程序
- 网络Api 1
- 网络Api 2
桌面客户端调用(HttpPost) => Web API 1 (HttpPost) => Web API 2
Web API 1 是内部的,我们可以 control/update 它。 Web API 2 是外部的,我们不能 update/improve 它。
客户端桌面应用程序每天发送大量 JSON 格式的数据和数百个请求。发送和接收数据以填充客户端桌面范围内的本地数据库。
我们的瓶颈在Web API 2 ,速度很慢,每次发送请求都需要很长时间才能完成。所以通常情况下,Web API 1 会超时,桌面客户端也会超时并一直加载。有时这个过程可能需要几天时间。
客户端桌面正在通过 HttpClient 调用 Web API 1.
我在那里看到的方法是在 Web Api 1 级别创建一个中间 DB/table,它存储应该发送到 Web API 2 的数据。我们将从桌面客户端接收此数据,然后立即将其存储在数据库中。然后 process/scheduled 作业可以 运行 读取这个中间的新记录 DB/Table 并将数据发送到 Web API 2. 这个过程可以在超时或存储的情况下执行重试逻辑每个请求的数据以提供报告以查看进度和错误数量。
在这种情况下,表结构可能类似于 Job(JobId/Progress/Status) => Data Items (Data/AddedDate/Status/ErrorMessage)
在流程中添加这个中间数据库对您来说有意义吗? 您会推荐其他以性能为导向的选项来解决这种情况吗?比如Queues,Cache,No-SQL存储?
任何建议或体系结构指南将不胜感激,我不是架构师或专家,但我想确定可以采取哪些道路和方法。我认为这是处理高数据量的数据系统中的常见问题。
您对架构的想法是一个很好的起点。
客户端 <-> 内部 WebApi
因此,当客户端向内部 WebAPI 发送请求时,应将其视为 “摄取服务”。它接受请求,将其存储在中间持久存储中并向客户端确认该事实。
HTTP Status Code 202 (Accepted) 通常用于请求收到、接受但 未 处理的这些情况。
响应可以(非强制性)包含请求的标识符。这可用于检索处理状态:
- 内部 WebApi 可能公开 GET 端点(如
/{id}/status
)- 客户端可以根据用户需求发出请求,也可以long-poll在后台发出请求
- 或者您可以在客户端和内部 WebApi 之间使用 WebSocket,这样服务就可以通知客户端请求状态的变化
内部 WebApi <-> 外部 WebApi
正如所说,内部 WebApi 充当摄取服务。它有一个本地(如果是高可用性复制的)存储。如果你想拥有强大的解决方案(这样挂起的请求可以在服务崩溃后幸存下来)那么存储应该是持久的而不是短暂的。
存储的选择取决于很多因素,例如
- 负载大小,
- 保留政策,
- 请求排序
- 消费者数量
- 等等
因此,在不了解确切需求和情况的情况下,不可能提出好的解决方案。
这里我想强调一件关于重试的事情。不要盲目地为任何请求应用重试逻辑。为了执行重试逻辑,应满足以下先决条件:
- 潜在引入的可观察影响是可以接受的
- 可以重做操作,没有任何不可逆的副作用
- 与承诺的可靠性相比,引入的复杂性可以忽略不计
有关详细信息,请查看 my article regarding retry policy in general。