Отключение балансировки нагрузки gRP C на выходе сервера - PullRequest
0 голосов
/ 06 февраля 2020

Я столкнулся с проблемой с моей связью gRP C. Дело в том, что мне нужно следить за порядком своих мероприятий. События отправляются по нескольким потокам, но поступают только из одного потока. Мне нужно сохранить этот порядок на стороне клиента, чтобы мои состояния были согласованными.

Для тестирования я посылаю сообщение попеременно на stream1 и stream2 (сообщение на 1, затем сообщение на 2, затем сообщение на 1, и т. Д. c.).

Мне удалось отключить многопоточную часть клиента, изменив исполнителей:

.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);
     }
  }
}

Теперь, после небольшой загрузки моей системы и повторной проверки, у меня все еще есть вопрос. Я получаю случайным образом 5 сообщений в потоке 1, затем 2 в потоке 2, затем 1 в потоке 1, затем 3 в потоке 2 и т. Д. c.

Мой вопрос: как я могу контролировать сервер, чтобы избежать такого рода вывода Балансировка нагрузки?

На стороне клиента я исправил это с помощью executor, но мне кажется, что он используется только для приема.

1 Ответ

0 голосов
/ 06 февраля 2020

межпотоковый порядок не гарантируется на уровне http2. Лучше всего, если клиент генерирует порядковый номер, поэтому вы можете обработать его по порядку на стороне сервера. или используя один поток (вероятно, не вариант).

btw, балансировка нагрузки имеет особое значение. Ваша проблема не связана с балансировкой нагрузки.

...