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

异步微服务上的客户端确认

戚浩淼
2023-03-14

我到处都读到微服务中的服务对服务调用应该是异步的。当请求必须通过2个或多个异步服务时,我们如何进行客户端确认?

这是我的实时场景。我们正在我们的组织中开发电子邮件发送功能。我们计划按以下顺序为此提供4个API服务。

  1. 公共API-将电子邮件功能公开给公共
  2. 验证API-验证电子邮件和其他字段的真实性
  3. 模板获取API-从数据库/CMS中获取电子邮件模板并准备要发送的最终内容
  4. 电子邮件发送API-将接收收件人和电子邮件内容

问题是,如果成功,我们必须用一些id确认发起请求的客户端,否则必须返回错误代码。如果我们必须调整进行异步服务到服务调用的最佳实践,我们如何从电子邮件发送API(最终API)中确认客户端

共有1个答案

索曾琪
2023-03-14

简单的方法是创建一个令牌,客户端可以在以后使用该令牌来检查请求的状态。您需要将GetState方法添加到公共API以在请求时返回状态。

在收到初始请求时创建GUID,将此令牌返回给调用客户端。这将是他们对收到请求的确认。保留令牌并将其记录为最初将接收到的请求的当前状态。使用请求调用验证API并包含令牌。

当验证API完成其工作时,它将更新请求的状态。如果存在验证问题,它将使用适当的错误消息更新状态,否则它将将状态更新为已验证,然后调用模板API,传递请求和令牌。

使用模板API和发送API重复上述操作。当发送API完成其工作时,它只需将请求的状态更新为“完成”。

客户端只需提供其初始请求返回的令牌,即可随时调用API上的GetStatus方法。如果提供了不存在的GUID,该方法只应返回请求的状态或未找到的状态。

这样做的好处是,你不必陷入回调和其他疯狂行为,而打电话的客户只需要担心两件事:提出请求和检查其状态。客户可以随心所欲地关心或不关心状态。它还允许您在链中添加更多服务,而无需重写外部接口。

细微差别涉及如何以及持续多长时间的请求状态。这实际上取决于系统需求和可用资源。可以是数据库、缓存或某种组合。

 类似资料:
  • 异步Mysql客户端 AsyncMysql::query($sql, $usePool = true) 第二个参数设为false将不会使用连接池中的资源,默认都会从连接池中取,配置连接池数量 => config/database.php 具体使用 use AsyncMysql; //设置超时时间 AsyncMysql::setTimeout(2); $res = (

  • 异步Redis客户端 连接池(连接池默认开启) use AsyncRedis; //关闭连接池 AsyncRedis::enablePool(false); //开启连接池 AsyncRedis::enablePool(true); 使用AsyncRedis use AsyncRedis; //设置超时时间 AsyncRedis::s

  • 异步Http客户端 Get方式 1.使用域名形式 use AsyncHttp; //直接使用域名, get方式 $http = new AsyncHttp('http://groupco.com'); //设置2s超时 $http->setTimeout(2); //$http->setCookies(['token' => 'xxxx']);

  • 异步Tcp客户端 串行发包 use AsyncTcp; $tcp = new AsyncTcp('127.0.0.1', 9501); $tcp->setTimeout(2); //串行发送 $res = (yield $tcp->call('hello server!')); $res = (yield $tcp->call('hello serv

  • Lazy 微服务客户端 Sometimes you have to load initial data before you can create your @Client(). In this case, you can use ClientProxyFactory, which provides create() method. 有时候在创建@Client()之前你需要加载原始数据。这时,你可

  • 脚本 我正在使用微服务构建快递服务系统。我不确定一些事情,这是我的场景 预订API-这是客户下订单的地方 付款API-这是我们处理预订付款的地方 通知API-有服务负责在一切完成后发送通知。 系统采用事件驱动架构。当客户下预订订单时,我在预订应用编程接口中提交本地交易并发布事件。支付应用编程接口和通知应用编程接口订阅了各自的事件。一旦完成,支付和通知应用编程接口需要向预订应用编程接口确认。 我的问