Передача сообщений между удаленными процессорами почтовых ящиков?

Я использую MailboxProcessor классы, чтобы держать отдельных агентов, которые занимаются своими делами. Обычно агенты могут взаимодействовать друг с другом в одном процессе, но я хочу, чтобы агенты общались друг с другом, когда они находятся в разных процессах или даже на разных машинах. Какой механизм лучше всего подходит для осуществления связи между ними? Есть какое-то стандартное решение?

Обратите внимание, что я использую экземпляры Ubuntu для запуска агентов.


person Dmitri Nesteruk    schedule 31.01.2011    source источник
comment
Кто посчитал это «не по теме»? Если вы не понимаете вопрос, пожалуйста, не мешайте ему.   -  person Mauricio Scheffer    schedule 31.01.2011
comment
stackoverflow.com/questions/501656/ может дать некоторое представление.   -  person Greg Campbell    schedule 31.01.2011
comment
Может быть, посмотрите на лазурные очереди окон. Это то, что они используют, чтобы позволить различным машинам (они называют их рабочими ролями) общаться друг с другом. Что вы можете сделать, так это иметь агента на каждой машине, который отвечает за связь с другими, чтобы либо запрашивать работу, либо уведомлять о выполнении работы и т. Д.   -  person jlezard    schedule 08.02.2011
comment
@jlezard интересно, но я не использую Azure. Я уже понял, что мне нужно создать собственный тип инфраструктуры очередей.   -  person Dmitri Nesteruk    schedule 15.02.2011


Ответы (1)


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

Я бы посмотрел на что-то вроде RPyC (http://rpyc.wikidot.com/), поскольку он предоставляет протокол, похожий на то, что вы ищете.

В основном ответ - «нет», на самом деле нет хорошего способа сделать это.

person Timothy Baldridge    schedule 01.02.2011
comment
знаете ли вы, как это будет происходить на других языках, в которых есть агенты: Erlang, Scala и т. д.? Спасибо! - person jlezard; 08.02.2011
comment
Что ж, в Erlang у вас нет разделяемой памяти. Каждый поток - это действительно отдельный процесс. Итак, когда вы говорите, что pid ! "foo" pid - это просто идентификатор процесса, которому "foo" отправляется. Поскольку разделяемой памяти нет, а процессы уже имеют pid, работа в сети так же проста, как создание словаря сопоставлений pid с IP и передача сообщений на основе этой информации. Проблема с этим методом заключается в том, что все коммуникации должны осуществляться через передачу сообщений, и в настоящее время также включает в себя копию сообщения в памяти. С точки зрения производительности это не всегда лучший вариант. У меня нет опыта работы со Scala. - person Timothy Baldridge; 08.02.2011
comment
И я должен пояснить, что процессы Erlang - это не процессы ОС, это процессы ВМ. У процесса Erlang накладные расходы на память составляют несколько сотен байтов. У процесса ОС накладные расходы составляют несколько килобайт. - person Timothy Baldridge; 08.02.2011