处理具有相同正文的多个请求 - REST API

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

假设我有一个微服务,它只是将用户注册到数据库中,然后将其公开给客户端。我想了解处理以下场景的更好方法是什么,

  1. 如果用户并行发送多个具有相同请求正文的请求(例如 1 秒内 10 个请求)怎么办?我应该将请求保留在队列中并注册第一个用户并拒绝所有其他 9 个请求,还是应该对每个请求进行分类并比较具有相似请求正文的请求,如果其中任何一个具有不同的请求正文,则应选择一个每个和其余的都被拒绝?或者我能做的最好的事情是什么来处理这种情况?

  2. 我还想了解一件事,是否建议在全局 API 级别或微服务级别进行速率限制(例如每分钟 n 个请求)?

提前致谢!

rest queue microservices rate-limiting
2个回答
0
投票

最好的方法是使用幂等调用。而不是像这样暴露端点:

POST /users + payload

像这样公开端点:

PUT /user/ID + payload

您让调用者生成 id,然后您要求提供 UUID。有了UUID,不管是谁生成的。这样,如果调用者多次调用您的端点,则您第一次创建用户时,接下来的时间您只需使用相同的负载更新用户,这意味着您将什么也不做。至少你不会生成重复项。

通过速率限制来保护您的服务始终是一个好习惯。您必须在 API 级别设置它。如果你在微服务级别定义它,如果你有N个实例,你将授权N倍的速率,因为你将分发请求。


0
投票

可以通过不同的方式处理 .NET Core API 中的并发用户注册请求,最佳方法取决于您的具体用例和要求。以下是一些需要考虑的策略:

请求重复数据删除: 如果您希望保证在一定时间范围(例如1秒)内,相同的请求只注册一次,可以实现请求去重。 将每个传入请求主体的哈希值存储在缓存或数据库中。在处理新的注册请求之前,请检查其哈希值是否已存在于存储中。如果是,则将请求视为重复而拒绝。

队列处理: 您可以使用消息队列(例如 RabbitMQ 或 Azure 服务总线)来管理注册过程。 当收到注册请求时,将其放入消息队列中。让工作人员服务按顺序处理队列。这可确保一次按照收到的顺序处理一个请求。

并发控制: 您可以在 API 中实施并发控制来处理并发请求。例如,您可以使用锁或类似的机制来确保一次仅处理一个请求。 如果并发流量较高,这种方法可能会导致某些请求延迟。

速率限制: 实施速率限制可以帮助管理传入请求,防止单个用户或系统淹没您的 API。 速率限制可以应用于全局 API 级别(以确保所有端点的公平使用)和微服务级别(以对特定端点实施不同的速率限制)。

这些方法之间的选择取决于您的具体要求和性能考虑。以下是一些注意事项:

数据一致性:如果保持严格的数据一致性至关重要,请考虑重复数据删除或队列处理。

性能:如果您期望非常高的请求率,请考虑并发控制以最大限度地减少资源开销。

速率限制:实施速率限制以保护您的 API 免遭滥用并确保所有客户端的公平访问。根据所需的行为考虑全局和微服务级别的速率限制。

复杂性:重复数据删除和队列处理可能会增加系统的复杂性,因此请评估增加的复杂性是否符合您的用例。

最佳方法取决于您的具体用例和性能要求。结合请求重复数据删除和速率限制等策略,可以为有效且高效地处理并发注册请求提供全面的解决方案。

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