Связь между сервером Erlang Gen - PullRequest
       2

Связь между сервером Erlang Gen

2 голосов
/ 30 сентября 2010

Я создаю приложение сетевого маршрутизатора с использованием Erlang OTP framework.

В процессе работы Супервизор создает два genservers и каждый estagen_server: call (CurrentProcName, {BinEvent, UniqueTrxId, MdPid}, infinity), мигает по TCP-соединению с двумя отдельными серверами.

Теперь при запуске приложения бывает, что один genserver получает дублирующееся событие, в таком случае я хочу, чтобы это событие было обработано вторым gen_server.

Для этого я звоню gen_server: call (NextProcName, {BinEvent, UniqueTrxId, MdPid}, бесконечность) ,

Эта функция, которую я вызываю внутри модуля gen_server, когда выполняется условие для дублированного события.

NextProcName :: Это зарегистрированное имя для второго gen_server

ПРИМЕЧАНИЕ :: код остается тем же для обоих gen_server

Проблема в том, что я могу дублировать события, но событие как-то не передается второму серверу gen_server: (

Пожалуйста, предложите, если я делаю это неправильно или нет.

1 Ответ

3 голосов
/ 30 сентября 2010

Если вы можете поделиться источником, будет признателен.

Вы уверены, что сообщение действительно получено или вы просто не получили ответ?

Наиболее вероятная проблема, которую я вижу здесь, заключается в том, что вы пересылаете сообщение синхронно. Если это не так, то вы можете полностью игнорировать мой пост. А пока давайте посмотрим, как работает синхронная переадресация:

 client          server1             server2
   |                |                   |
   >--- Msg1 ----> (ok)                 |
(waits S1)          |                   | 
  (ok) <-- Reply ---<                   |
   >--- Msg2 ----> (ok)                 |
(waits S1)          >----- Msg2 -----> (ok)
(waits S1)      (waits S2) <--- Reply --<      
(waits S1)      (Waits S2)              |

          *Stuff crashes*

Это не совсем понятно, но показывает, что происходит. Здесь Server1 в основном все еще считается обработкой сообщения Msg2 к поведению gen_server и, таким образом, никогда не будет читать ответ от Server2, который он ожидает. Это обычно заканчивается тайм-аутом и сбоем.

Правильный способ сделать это - вместо этого отправить асинхронный вызов (cast) из Server1 в Server2, включая переменную From, чтобы Server2 мог ответить с помощью gen_server:reply/2 для замены сам по себе Server1. Server1 должен затем вернуться с noreply кортежем. Это освободит процесс Server1 и сможет продолжать обрабатывать другие вещи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...