【发布时间】:2020-02-06 09:35:54
【问题描述】:
我的 gRPC 通信遇到问题。担心的是我需要保持事件的顺序。事件通过多个流发送,但仅来自一个线程。我需要在客户端保持该顺序,以使我的状态保持一致。
为了进行测试,我在 stream1 和 stream2 上交替发送消息(1 上的消息,2 上的消息,1 上的消息,等等)。
我可以通过修改执行器来禁用客户端的线程部分:
.withExecutor(new SerialExecutor(new DirectExecutor()));
class DirectExecutor implements Executor
{
public void execute(Runnable r)
{
r.run();
}
}
private class SerialExecutor implements Executor
{
final Queue<Runnable> tasks = new ArrayDeque<>();
final Executor executor;
Runnable active;
SerialExecutor(Executor executor)
{
this.executor = executor;
}
public synchronized void execute(Runnable r)
{
tasks.add(() -> {
try
{
r.run();
} finally
{
scheduleNext();
}
});
if (active == null)
{
scheduleNext();
}
}
protected synchronized void scheduleNext()
{
if ((active = tasks.poll()) != null)
{
executor.execute(active);
}
}
}
现在加载一点我的系统并再次检查后,我仍然遇到问题。我在 stream1 上随机收到 5 条消息,然后在 stream2 上收到 2 条消息,然后在 stream1 上收到 1 条消息,然后在 stream2 上收到 3 条消息,等等。
我的问题是:如何控制服务器以避免这种输出负载平衡?
在客户端我使用执行器修复了它,但我觉得它只用于接收。
【问题讨论】:
标签: load-balancing grpc grpc-java