【问题标题】:How to use messaging (Amazon SQS) in web api to return created id to the client如何在 Web api 中使用消息传递 (Amazon SQS) 将创建的 id 返回给客户端
【发布时间】:2017-02-08 20:50:07
【问题描述】:

刚开始使用 Amazon SQS 服务,所以想知道是否有人可以引导我走向正确的方向。 如果我向客户端公开了 rest web-api 接口,并且在每个 http 请求之后,我想将异步消息发送到我的单独服务,该服务负责在数据库中创建特定实体并使用一些逻辑进行处理。像这样的:

        var auctionRegistrationCommand = AuctionRegistrationCommand
            .CreateFromRequest(lotId, request);

        //var sqsClient = new AmazonSQSClient();
        //var response = sqsClient.SendMessageAsync(..resitrationCommaon..);

创建实体后,我想将创建的实体的 ID 返回给我的客户端,以便它可以使用它来更新它或对 rest api 进行一些额外的调用。但我找不到怎么做。是否有任何模式或方法来支持这种情况?看到一些使用 Amazon SQS 的示例将是完美的,但一般解释也将非常有帮助。

【问题讨论】:

  • 第一部分是SQS的用例,第二部分更多是SNS的用例。一种简单的方法是让客户端轮询状态。
  • 使用单向消息传递时,应避免同步通信。客户端应该生成 id(使用 guid),然后后端可以使用它来创建您的记录。有意义吗?

标签: c# amazon-web-services asp.net-web-api amazon-sqs microservices


【解决方案1】:

假设您的两个系统是 S1 和 S2,会发生以下情况:

  1. S1 向 SQS 发送消息。此步骤是异步的。
  2. S2 创建所需的实体。
  3. S1 应通知调用者新创建的实体 ID。

考虑到异步系统的本质,#3 并不简单。例如,您不知道 S2 何时会处理您的请求。

可能的解决方案:

  1. S1 向 SQS 发送消息。 SQS 会返回一个MessageId 作为响应。您将此MessageId 返还给客户。
  2. S1 和 S2 都有一个共享数据存储(例如,Memcache、MySQL 等),用于存储 MessageId 到实体 ID 的映射。每当 S2 处理消息并创建新实体时,它都会在共享数据存储中更新此映射。
  3. 客户端使用MessageId 轮询S1。只要 S1 为非空,S1 就会从数据存储中返回映射。

可以在 here 找到来自 SQS 的 SendMessage API 的 MessageId 的文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-07
    • 2017-04-02
    • 2013-03-17
    • 1970-01-01
    • 2020-04-21
    • 2021-11-07
    • 1970-01-01
    • 2022-08-05
    相关资源
    最近更新 更多