2011-01-31 9 views
11

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

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

+7

Кто голосовал как «не по теме»? Если вы не понимаете вопрос, не мешайте ему. –

+1

http://stackoverflow.com/questions/501656/f-mailbox-processor-on-distributed-systems могут дать некоторое представление. –

+0

, возможно, посмотрите на окна azure в Windows. Его то, что они используют, позволяет различным машинам (они называют их рабочими ролями) разговаривать друг с другом. То, что вы можете сделать, это иметь агента на каждой машине, которая отвечает за общение с другими, чтобы либо запросить работу, либо уведомить о работе, и т. Д. – jlezard

ответ

3

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

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

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

+0

вы знаете, как это будет происходить на других языках, где есть агенты: Erlang, Scala и co? Благодаря! – jlezard

+0

Ну, в Эрланге у вас нет общей памяти. Каждая «нить» - это действительно отдельный процесс. Поэтому, когда вы говорите «pid! «foo» 'pid - это просто идентификатор процесса, к которому отправляется' 'foo' '. Поскольку нет общей памяти, а процессы уже имеют pids, сетевое взаимодействие так же просто, как создание словаря pid-IP-сопоставлений и передачи сообщений на основе этой информации. Проблема с этим методом заключается в том, что вся связь должна выполняться посредством передачи сообщений, а в настоящее время также включает в себя копию копии сообщения. С точки зрения производительности это не всегда лучше. У меня нет опыта работы с Scala. –

+0

И я должен судить, процессы Erlang не являются процессами ОС, они являются процессами VM. Процесс Erlang имеет накладные расходы на несколько сотен байт. Процесс ОС имеет накладные расходы в диапазоне с несколькими КБ. –

Смежные вопросы