Передача сообщений как erlang в C # с очень большим потоком данных - PullRequest
1 голос
/ 03 января 2012

Это вопрос о передаче сообщений. Это относится конкретно к внутреннему приложению, написанному на C #. Но у него есть доморощенная система передачи сообщений, напоминающая эрланг.

Хорошо, мы надеемся, что можно будет поучиться у ребят из Эрланга или документации, чтобы найти элегантное решение для пары задач передачи сообщений. Но, увы, после прочтения документации erlang в Интернете и на форумах эти темы, похоже, не рассматриваются - что мы можем найти.

Итак, вопрос: в erlang, когда очередь для отправки сообщений процессу заполняется? И обрабатывает ли Erlang очередь в полной ситуации? Или очереди для передачи сообщений в эрланге безграничны - это ограничено только системной памятью?

Что ж, в нашей системе это включает обработку потока финансовых данных с потенциально миллиардами кортежей информации, считываемой с диска, каждый кортеж финансовой информации в финансовом мире называется "галочкой".

Поэтому было необходимо установить ограничение на размер очереди каждого «процесса» в нашей системе. Мы произвольно выбрали не более 1000 элементов в каждой очереди. Теперь эти очереди быстро заполняются галочками.

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

В качестве решения "помощи в полосе" (которое является беспорядочным) разрешают несколько очередей на процесс для каждого типа сообщений. Таким образом, у процесса будет очередь с галочками, очередь с командами, очередь с заполнением и т. Д.

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

Так что, возможно, это вопрос о внутренностях эрланга. Есть ли у erlang внутренние ограничения на типы сообщений в очереди? Или у него внутри отдельная очередь для каждого типа сообщений?

В любом случае, как отправляющие процессы знают, когда очередь переполнена, чтобы принимать сообщения определенных типов? Отправка не удалась? Означает ли это, что обработка ошибок в erlang становится необходимой для невозможности отправки?

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

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

У меня возникло, возможно, ошибочное впечатление, что erlang не был разработан для обработки этой ситуации, поэтому, возможно, он не решает проблему заполнения очередей потоком сообщений одного типа.

Но мы надеемся, что кто-то знает, как ответить на этот вопрос на хорошую справочную информацию или книгу, которая освещает этот конкретный сценарий.

Ответы [ 2 ]

3 голосов
/ 03 января 2012

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

Есть способы обойти это, порождая процессы-обработчики, которые регулируют трафик и расставляют приоритеты, но виртуальная машина Erlang как таковая не поддерживает его.

1 голос
/ 03 января 2012

Ответ на дополнительный вопрос в комментарии:

Даже в онлайн-книгах Safari главные из них никогда не говорят о том, как сообщения передаются на эрланге.Понятно, что они не использовали «общую память».Так как они общаются?это через loopback tcp / ip, когда на той же машине?

Внутри одной виртуальной машины сообщения просто копируются (за исключением достаточно больших двоичных файлов; для них копируются указатели) между областями памяти, назначенными дляпроцессы.Если вы запустили несколько виртуальных машин Erlang на одном компьютере, они могут обмениваться данными по TCP / IP.

...