Всем привет.
Я сейчас пытаюсь написать эффективную реализацию механизма pubsub для эрланговых процессов. Если вдруг окажется, что существует такая вещь (а я искал - не нашел) - подскажите и не читайте дальше :)
Первая проблема - эффективная рассылка сообщений. Самый простой вариант - отправка сообщения прямо из handle_* функции, пробежавшись по списку пидов-получателей из стейта процесса (наколеночный получасовой код лежит тут:
http://github.com/shizzard/ebus). Второй вариант, который сразу приходит на ум - отправка сообщений из короткоживущего процесса, который спаунится специально для рассылки одного сообщения и сразу умирает после выполнения этой задачи. Собственно, вопрос: какой вариант правильнее? Может, существует еще один способ такой рассылки, который будет быстрее.
Вторая проблема - хранение списка получателей (процессов, подписанных на канал). Самый простой способ, опять же - хранить их в стейте процесса канала, как это и реализовано в ebus. Проблема в том, что если процесс канала упадет, канал потеряет пиды всех получателей, что недопустимо. Можно хранить список в ETS, но мне такая реализация не кажется эффективной (дергаенье ETS на каждом паблише в канал и создание по одной табличке на канал). Можно получить "гибридный" вариант - все изменения списка получателей кладутся в ETS, но рассылка производится по списку, "закешированному" в стейте процесса. Является ли этот вариант оптимальным?
Третья проблема - что делать, если процесс канала таки упал. Нужно каким-либо образом уведомить клиентов канала (а это не только слушатели, но и паблишеры) о том, что процесс помер. Если со слушателями здесь проще - слушателю, в принципе, пофигу от какого pid ему сообщение из канала приедет - то с паблишерами сложнее. Можно использовать gproc, но тогда каждый паблиш будет лезть в gproc, что, как я понял из изучения исходников, приводит к чтению данных из ETS. Есть ли какое-нибудь эффективное решение подобной проблемы?