希望你一切顺利,我有一个小问题一直困扰着我。
我在 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 继续运行而不是抛出输出响应。
那么如何实现两者之间的这种交互呢?
我很难理解你的问题描述。我的猜测是,您的 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 我并不是说这是不可能的,只是不支持。