load-balancing - 在服务器端输出上禁用 gRPC 负载平衡
问题描述
我的 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 条消息,等等。
我的问题是:如何控制服务器以避免这种输出负载平衡?
在客户端,我使用执行器修复了它,但我觉得它仅用于接收。
解决方案
http2 层不保证流间顺序。您最好的选择是客户端生成一个序列号,因此您可以在服务器端按顺序处理它。或使用单个流(可能不是一个选项)。
顺便说一句,负载平衡具有特殊的含义。您的问题与负载平衡无关。
推荐阅读
- python - 安装 Python 的 Mageck 包时无法修复 C 编译环境错误
- css - Bootstrap NavDropdown ClassName active 不存在,如何知道何时选择了下拉元素?
- python - 有没有办法在 Kivy 中创建 2D 难以处理的网格?
- iis - 应用程序托管在托管术语中的 w3wp.exe(进程内)或 application.exe/dotnet.exe(进程外)中的含义
- python - CSV 文件未正确写入 ByteString
- python - 规范化数据集以查找季节性和平均 python pandas
- html - mvc 视图选择下拉 ui 改进
- reactjs - 你可以使用 gatsby-source-mongodb 来发布数据吗?
- python - / 不支持的操作数类型:“方法”和“方法”,Django
- makefile - 从位于多个文件夹中的源文件生成目标文件