如何在 REST API 运行期间触发 bidiStream gRPC API 再次发送消息

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

希望你一切顺利,我有一个小问题一直困扰着我。

我在 REST 和 gRPC(bidiStream 类型)之间进行交互,如下所示:gRPC 将调用以启动会话,然后我投射 REST 一个,它的响应将处于待机状态(粗略地说,这意味着加载),直到 gRPC 调用再次让它抛出响应,我编写了一个脚本,如下所示

exec(
    fromClientSide
      .connect
      .header(metadataObject.Authorization)(s"Bearer ${metadataObject.TokenKey}")
      .callOptions(CallOptions.DEFAULT.withDeadlineAfter(30, TimeUnit.SECONDS))
      .endCheck(statusCode is Status.Code.OK)
  )
  .exec(
    fromClientSide
      .send(WarmUp_Msg)
  )
  .pause(200)
  .exec(
    REST_API_HERE
  )
  .during(2){
    exec(
    fromClientSide
      .send(request_Msg)
  )
    .exec(complete)
  }
  .exec(fromClientSide.reconciliate(waitFor = NextMessage))

据我了解示例中的 during(),我看到您可以触发 chatCall 来发送新包,我想我做了同样的事情,但我不确定为什么 REST API 继续运行而不是抛出输出响应。

那么如何实现两者之间的这种交互呢?

scala grpc gatling akka-grpc
1个回答
0
投票

我很难理解你的问题描述。我的猜测是,您的 HTTP 调用只会在流完成(或流中的某些消息)后返回。

这听起来像鲁布·戈德堡机器。


在一连串的动作中,加特林中的虚拟用户一一完成它们。用伪代码重写你的加特林代码:

grpc_stream = connect()
grpc_stream.send(WarmUp_Msg)
sleep(200)
make_http_call()
t = now()
while now() < t + 2
    grpc_stream.send(request_Msg)
grpc_stream.complete()
reconciliate(grpc_stream)

我希望现在很明显,伪代码的第 7 行在第 4 行完成之前不会执行。

换句话说,在你的

fromClientSide.send(request_Msg)
完成之前,
REST_API_HERE
不会被执行。


换句话说,您正在 Gadling 中寻找一种方法来启动 HTTP 请求,而不“阻止”1 虚拟用户,然后虚拟用户在 gRPC 流中发送消息。

不支持此用法。2

您可以尝试用两个虚拟用户来模拟。一个进行 HTTP 调用,另一个进行流式 gRPC 调用。

或者更好的是,消除后端设计的复杂性。


1 Gattle 的“非阻塞”方面是线程不会被 IO 阻塞。

2 我并不是说这是不可能的,只是不支持。

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