Страницы

воскресенье, 1 мая 2016 г.

Go Tail MongoDB

На днях написал простенький Go пакет по имени mgotail, предназначенный для получения свежих документов из MongoDB capped collections с помощью tailable cursors. Node.js модуль mongodb-tail справляется с этой задачей, но в силу своей природы не эффективен если использовать несколько процессорных ядер. Писать код на Go я начал совсем недавно, пока как говорится "верхушек нахватался", может быть поэтому решение на Go мне кажется и быстрее, и надежнее.


Если запустить любой из примеров, можно наблюдать следующую картину:
  - обрыв соединения не мешает сервису продолжить свою работу после восстановления соединения

- и это может продолжаться довольно долго

Что не так с Node.js? Все ок не считая его single threaded model, которая никак не попадает в контекст: здесь нужен один "суперпроцесс" который будет "тащить" все самостоятельно, и на эту роль код на Node.js никак не подходит. Пара вариантов архитектуры подобного решения:
- приложение создает дочерний процесс каждый раз при получении нового документа для его обработки - дороговато
- приложение состоит из нескольких процессов (к примеру кластер), при этом:
  - на каждое ядро будет создан процесс
  - на каждый процесс будет создан курсор
  - каждый процесс будет получать свежие документы
  - каждому процессу нужно будет решить для себя обрабатывать ему полученный документ или нет... плюс еще куча издержек связанных с хранением состояния... в общем тоже не вариант

Почему Go? Просто решил попробовать что-то новое, и Go меня не разочаровал, пока этот парень мне нравится :)

Дисклеймер: по понятным причинам этот код может быть не совсем "gopher style", замечания приветствуются.