2017-02-12 16 views
0

Im заинтересовался концептуальной эффективностью 1-n против многопоточности в ZMQ.ZMQ 1-n в очереди на многопоточность

позвольте мне начать, давая conseptual проблему:

У меня есть 20 клиентов и один сервер. (Я буду использовать разъемы push и pull для удобства, но им интересно, если ответ будет изменен с rep, req, дилером, маршрутизатором).

Если клиенты имеют push-разъемы и сервер, то все сообщения попадают в одно нажатие на сервер. ZMQ будет честно размещать push-сообщения на сервере, а контексту может быть задан аргумент инициализации для количества используемых потоков.

Но что происходит под капотом? это опрос входов или многопотоковых сообщений между ними. Принесут ли какие-либо выгоды от их многопоточности?

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

1) используйте один разъем на сервере и нажимайте на каждого клиента.

2) используйте 20 разъемов на сервере, используя опрос zmq, чтобы выбрать из них действия. клиенты по-прежнему имеют push-разъем.

3) использовать 20 тяговых игроков на сервере каждый в пределах своей собственной нити (например, 20 потоков). Клиенты имеют одинаковые 20 точечных разъемов (по 1 штуки).

Я понимаю, что не используя вариант 1, теряющий динамический характер вновь присоединенных клиентов, а опция 2 удаляет честную очередь, но им просто интересно в эффективности.

Это мой вопрос, потоки клиентов? или просто использовать zmq 1-n?

+1

Добро пожаловать в Переполнение стека. Пожалуйста, найдите время, чтобы прочитать [The Tour] (http://stackoverflow.com/tour) и обратитесь к материалу из [Справочного центра] (http://stackoverflow.com/help/asking) о том, что и как вы можете спросите здесь. –

+0

Ваш вопрос, кажется, лучше спросить в [SE Software Engineering] (http://softwareengineering.stackexchange.com/). –

+0

@ πάνταῥεῖ при обращении к другим сайтам, часто бывает полезно указать, что [перекрестная публикация неодобрительно] (http://meta.stackexchange.com/tags/cross-posting/info) – gnat

ответ

0

Под капотом ZMQ использует такие вещи, как select(), epoll() и т. Д. Эти фоновые потоки запускают протокол zmqtp, который используется для транспортировки ваших сообщений, реализации шаблонов и т. Д. Ваша программа взаимодействует с этими потоками, используя zmq_send(), zmq_recv(), и также также zmq_poll(), который сам использует select(). Таким образом, AFAIK все достаточно эффективно, все блокируется, когда ничего не происходит, и нет ничего, что можно было бы получить путем многопоточности всего этого.

По этой причине транспорт IPC не работает в Windows. Нет выбора() для труб в Windows, тогда как на * nix-каналах, сокетах, файлах и т. Д. Все дескрипторы файлов и select() работают для них всех.

Эта особенность Windows была крупной PITA для таких вещей, как Cygwin; они реализовали функцию select() POSIX в Windows, запустив поток на дескриптор файла без сокета и опросив именованные каналы, последовательные порты и т. д. Таким образом, в Cygwin вы можете создавать каналы и включать их в вызов select(), но, следовательно, есть куча нитей, опробовавших нижние окна Windows, что неэффективно. Авторы ZMQ решили не делать этого.

Вам нужно будет выполнить только 2) или 3), если время обслуживания каждого клиента в 1) больше времени, необходимого для передачи сообщений от клиента на сервер. Помните, что все это - ваш Ethernet-сетевой адаптер, все равно все это происходит. Наличие большего количества потоков на сервере не сделает Ethernet более быстрым.

+0

Привет, спасибо за ваш комментарий. Я понимаю, что я ограничена моей или сетью. Im работает с высокоскоростными соединениями 10Gb между сервером и клиентами и будет почти максимизировать пропускную способность, отправляя столько же данных, сколько я по-человечески. Все клиенты будут пытаться говорить одновременно и разгружать свои данные. Вот почему они заинтересованы в эффективности. Без прошивки он будет читать клиентов по одному. Многопоточность их читала бы их в parrellel. Это моя проблема. Я хочу, чтобы их читали вместе, а не в очереди. Скорость - приоритет. – Nolva

+0

Похоже, вы направляетесь к шаблону балансировки нагрузки http://zguide.zeromq.org/page:all#The-Load-Balancing-Pattern. В этом случае у вас есть посредник посередине, и вы добавляете что-то к отправляемым сообщениям, чтобы позволить брокеру связывать прямые и обратные сообщения с клиентами/серверами. Вы можете адаптировать его для использования push pull. Брокер выступает в качестве единственной точки контакта для клиентов и направляет сообщения на несколько серверов, выбирая по мере необходимости серверы. – bazza

+0

спасибо, руководство было хорошим чтением в течение длительного времени, чем это. Его на самом деле намного сложнее, чем это (вопрос был упрощен для общего любопытства SO). Его больше похоже на параноидальный пиратский микс с распределенными вычислениями с входами клиентского сервера ..... yeh его сложный ..... Iv фактически отошел от посреднических брокеров, который был моим первым портом захода, они arent масштабируемы. Система с тысячами компьютеров будет иметь один брокер/точку отказа, а скорость передачи данных через один узел будет слишком большой. У меня была импликация со вторым резервным брокером. – Nolva