Задержка с целлулоидом ZMQ вызывает проблемы с данными

Пример кода, чтобы объяснить мою проблему.

отправитель

Отправитель, который отправляет запрос на Сервер (через ZMQ) в формате

 ["sender-1", "sender-1-bdc1c14624076b691b8d9e15fbd754f1"]

 ..
 ["sender-99","sender-99-a2123d02c2989ef57da370bb13ba60e4"]

сервер

Сервер после получения данных от отправителя возвращает их получателю в том же формате.

  ["sender-1", "sender-1-bdc1c14624076b691b8d9e15fbd754f1"]

  ...
  ["sender-99","sender-99-a2123d02c2989ef57da370bb13ba60e4"]

Получатель

Получатель, получив запрос от Сервера, просто распечатывает сообщение.

Описание:

Если я не использую mutex определяется в этой строке(внутри сервера). Я вижу некоторые данные, появляющиеся на стороне получателя, которые не соответствуют вышеуказанному формату / стандарту.

Пример, который сервер напечатает (в этой строке)

"Sending sender-97 -- sender-97-9a284488454c8e8fd22bbbcf678895e9"

"Sending sender-98 -- sender-98-447eb5be94e7f6d949e764d7c88239ad"

Но на стороне получателя я вижу сообщения, которые выглядят так.

sender-97 -- sender-98   
sender-98-22d9f01a8f801f559a9ff4e388813251 --  

Вопрос:

На мой взгляд, это похоже на возможную проблему в теме (я могу ошибаться). При этом данные, которые передаются (внутри сервера) Celluloid ( отправка), изменяются другим потоком.

У меня сложилось впечатление, что Celluloid решает почти все ваши проблемы.

Правильно ли мое понимание всего этого?

1 ответ

Вам нужен асинхронный регистратор.

Всякий раз, когда вы используете puts вы выводите в буфер, который на самом деле очень медленный, по сравнению с другими вещами. То, что вы должны сделать, это использовать актер, используемый исключительно вместо puts везде.

Лучше всего было бы создать экземпляр контролируемого актера, скажем, по имени :logger а затем взаимодействовать с ним внутри других ваших актеров Celluloid[:logger].async.ouput() или вперед output в Celluloid[:logger].async так что каждый раз, когда вы используете output или же console или что-то в этом роде asynchronous вызов метода. Таким образом, даже если ваш актер, выполняющий работу, переходит к чему-то другому, вывод консоли все равно будет в идеальной последовательности.

Вывод вашей консоли искажается из-за вышеуказанной проблемы с асинхронностью в самом программировании, а не Celluloid... и это чрезвычайно распространенная проблема с и без ZeroMQ,


да defer нарушает последовательность вашего Receiver выходной, но нет это не Thread ошибка в Celluloid, Это естественное поведение асинхронных операций. В этом случае вам нужно удалить defer {} и хранить async.received_data() как у тебя

В противном случае, как вы видите, Server будет бомбардировать Receiver с сообщениями из последовательности. Также не помогает то, что вы напрямую управляете потоками поверх всего этого, а не позволяете Celluloid::ZMQ сделай это для тебя.

Также: я бы удалил все "внешние" потоки управления и удалил defer {} обертка... и пусть Celluloid::ZMQ сгладить все и сохранить последовательность для вас.

Другие вопросы по тегам