Многопоточная служба Windows - Erlang - PullRequest
1 голос
/ 02 апреля 2011

Я расскажу о проблеме, которую мне нужно решить, и мне нужны предложения, если я на правильном пути.

Проблема:

Мне нужно создать приложение-службу Windows, которое получит запрос и выполнит некоторые действия. (Связь через сокет). Это действие - выполнить скрипт (возможно, в lua или perl). Этот скрипт моделирует бизнес-правила клиента, запрашивает в базах данных, делает запрос на веб-сайтах и ​​затем отправляет ответ клиенту.

Есть 3 обязательных требования:

  1. Служба будет получать много запросов одновременно . Поэтому я думаю использовать модель потока работника.
  2. Служба должна иметь высокую пропускную способность . У меня будет много запросов в одну секунду.
  3. Низкая задержка : Я должен очень быстро ответить на эти запросы.

Каждый запрос будет генерировать записи в журнале. Я не могу записать эти записи в журнал на физическом диске одновременно с выполнением сценариев из-за большого времени ввода-вывода. Вероятно, я создам очередь в памяти, а другие будут ее использовать и записывать на диск.

В будущем возможно, что два потока woker придется менять сообщения.

Я должен составить протокол для этой службы. Я думал использовать Thrift, но я не знаю, какие накладные расходы. Может быть, я сделаю свой собственный протокол.

Чтобы написать службу windows, я думал на Эрланге. Это хорошая идея?

У кого-нибудь есть предложения / советы по решению этой проблемы? Какой язык лучше подходит для написания этой услуги?

1 Ответ

1 голос
/ 02 апреля 2011

Да, Erlang - хороший выбор, если вы знаете это или готовы учиться.С Erlang вам не нужны рабочие потоки, просто внедрите свой сервер в стиле Erlang, и вы получите многопоточное решение автоматически.

Не знаете, как преобразовать программу Erlang в службу Windows, но, вероятно, это выполнимо.

Запись в один и тот же файл журнала из многих потоков неоптимальна, поскольку требует блокировки.Лучше иметь очередь записей журнала (без блокировки?) И отдельный поток (процесс Эрланга?), Который записывает их в файл.Кстати, вы уверены, что выполнение внешнего скрипта на другом языке намного быстрее, чем запись записи в файл?

Сомнительно, что вы получите гораздо лучшую производительность с собственной библиотекой сериализации, чем Thrift бесплатно,Другой вариант - Буферы протокола Google , кто-то утверждал, что он быстрее.

Теоретически (!) Возможно, что решение Erlang не обеспечит вам требуемой производительности.В этом случае рассмотрим компилируемый язык, например C ++ и асинхронные сети, например Boost.Asio .Но будьте готовы, что это намного сложнее, чем Эрланг.

...