Это вопрос о передаче сообщений. Это относится конкретно к внутреннему приложению, написанному на C #. Но у него есть доморощенная система передачи сообщений, напоминающая эрланг.
Хорошо, мы надеемся, что можно будет поучиться у ребят из Эрланга или документации, чтобы найти элегантное решение для пары задач передачи сообщений. Но, увы, после прочтения документации erlang в Интернете и на форумах эти темы, похоже, не рассматриваются - что мы можем найти.
Итак, вопрос: в erlang, когда очередь для отправки сообщений процессу заполняется? И обрабатывает ли Erlang очередь в полной ситуации? Или очереди для передачи сообщений в эрланге безграничны - это ограничено только системной памятью?
Что ж, в нашей системе это включает обработку потока финансовых данных с потенциально миллиардами кортежей информации, считываемой с диска, каждый кортеж финансовой информации в финансовом мире называется "галочкой".
Поэтому было необходимо установить ограничение на размер очереди каждого «процесса» в нашей системе. Мы произвольно выбрали не более 1000 элементов в каждой очереди. Теперь эти очереди быстро заполняются галочками.
Проблема состоит в том, что процессам также необходимо отправлять друг другу другие типы сообщений, помимо просто тиков, но тики заполняют очереди, предотвращая прохождение любых других типов сообщений.
В качестве решения "помощи в полосе" (которое является беспорядочным) разрешают несколько очередей на процесс для каждого типа сообщений. Таким образом, у процесса будет очередь с галочками, очередь с командами, очередь с заполнением и т. Д.
Но эрланг кажется намного чище, поскольку для каждого «процесса», имеющего разные типы сообщений, имеется одна очередь. Но опять же, как это связано с тем, что очередь перегружена потоком только одного из типов сообщений?
Так что, возможно, это вопрос о внутренностях эрланга. Есть ли у erlang внутренние ограничения на типы сообщений в очереди? Или у него внутри отдельная очередь для каждого типа сообщений?
В любом случае, как отправляющие процессы знают, когда очередь переполнена, чтобы принимать сообщения определенных типов? Отправка не удалась? Означает ли это, что обработка ошибок в erlang становится необходимой для невозможности отправки?
В нашей системе он отслеживает заполнение очередей, а затем предотвращает запуск любых процессов, которые будут пытаться добавить в полную очередь, пока в этой очереди не будет больше места. Это позволяет избежать беспорядочной логики обработки ошибок, поскольку после запуска процессов гарантированно будет место для отправки одного сообщения.
Но опять же, если мы поместим несколько типов сообщений в одну и ту же очередь. Будут заблокированы сообщения других типов, которые должны пройти.
У меня возникло, возможно, ошибочное впечатление, что erlang не был разработан для обработки этой ситуации, поэтому, возможно, он не решает проблему заполнения очередей потоком сообщений одного типа.
Но мы надеемся, что кто-то знает, как ответить на этот вопрос на хорошую справочную информацию или книгу, которая освещает этот конкретный сценарий.