Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Cервер обработки сообщений / 25 сообщений из 38, страница 1 из 2
11.09.2014, 01:59:03
    #38743676
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cервер обработки сообщений
Есть сотня клиентов, каждый из которых ~ сто раз в секунду что-то хочет от сервера.
Это "что-то" (чего хотят клиенты от сервера) небольшое и уже (почти) готовое - "только спроси, сразу отдам".

Протокол tcp.

Возможно, клиентов будет не сто, а тыща.
...
Рейтинг: 0 / 0
11.09.2014, 02:12:24
    #38743679
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cервер обработки сообщений
Давно хотел ZeroMQ потрогать.

Кроме чтения описания и небольших тестов - не пробовал.

Только другим советы давал...


Для Delphi есть библиотека - оболочка: https://github.com/bvarga/delphizmq
...
Рейтинг: 0 / 0
11.09.2014, 02:26:38
    #38743681
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cервер обработки сообщений
Засада:

The package contains a wrapper (zmq.pas), and a higher level api (zmqapi.pas). It should work with ZMQ 2.2.x, and with 3.2.x.

А последний Stable Release на сегодня - 4.0.4.

Берем предыдущую 3.2.4, от греха подальше: http://miru.hk/archive/ZeroMQ-3.2.4~miru1.0-x86.exe

Из всей инсталляции нужна только библиотека libzmq-v90-mt-3_2_4.dll (ядро системы обмена сообщения, скомпилированная MS VS 2008, "релизный" вариант) -> переименовываем в libzmq.dll и помещаем в каталог с будущими исполняемыми файлами.
...
Рейтинг: 0 / 0
11.09.2014, 02:31:23
    #38743682
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cервер обработки сообщений
Не забываем, что для приложений, созданных в MS VS 2008, требуется "редистрибутабле пацк": http://www.microsoft.com/ru-ru/download/details.aspx?id=5582
Скорее всего, он у всех уже установлен, но мало ли.
...
Рейтинг: 0 / 0
11.09.2014, 02:42:56
    #38743683
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cервер обработки сообщений
Инсталлер можно не грузить, а построить библиотечку самостоятельно, из исходников: http://download.zeromq.org/zeromq-3.2.4.zip

Для построения нужна MS VS 2008 Pro для С++. Можно обойтись и бесплатной Express версией MS VS, но тогда пакет библиотек для построения в Windows придется грузить отдельно.

В инструкции пишут, что можно обойтись и MinGW: http://zeromq.org/build:mingw Однако, лично мне этого сделать так и не удалось.

В общем, MS VS 2008. Можно и более новую студию но, пишут, что приложения не будет работать на Win2K и WinXP.

Распаковываем скаченные исходники, открываем каталог builds\msvc, открываем из MS VS "решение" msvc.sln
Выбираем конфигурация "Release" и даем команду "построить решение" (F7).
Идём пить чай, это не дельфи, это минут на десять.
...
...
Рейтинг: 0 / 0
11.09.2014, 02:48:02
    #38743685
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cервер обработки сообщений
Готово.
В подкаталоге \lib появилась нужная библиотека: libzmq.dll. Какая-то она подозрительно маленькая (всего 186кБ), по сравнению с теми вариантами, что в инсталляторе были, но, надеюсь, это не беда :
...
Рейтинг: 0 / 0
11.09.2014, 02:59:00
    #38743687
Judo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cервер обработки сообщений
чччД - а зачем ты все это написал ?
...
Рейтинг: 0 / 0
11.09.2014, 02:59:22
    #38743688
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cервер обработки сообщений
Кроме "любезно приложенной мной" () dll - ки, для дельфикодинга нужен фал, описывающих функции в этой библиотеке.
Это есть вот здесь: https://codeload.github.com/bvarga/delphizmq/zip/master

Из всего, что скачано, для работы потребуется совсем чуть-чуть. Нужны два файлика:

1. zmq.pas
2. zmq.inc

Если хочется работать не с функциями dll, а использовать дельфийские классы - обертки, то можно использоват еще два файлика:

3. zhelpers.pas
4. zmqapi.pas

Как работать - примерно описано в файле README.md.
...
Рейтинг: 0 / 0
11.09.2014, 03:01:15
    #38743690
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cервер обработки сообщений
Всё! Будем писать сверхскоростной сервер обработки сообщений. :)

...пошел варить кофе.
...
Рейтинг: 0 / 0
11.09.2014, 03:03:38
    #38743692
Judo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cервер обработки сообщений
READMEYou should use the higher level api, which'll save you a lot of time, and incidentally
the code'll be easier to read.

Очередная реинкарнация )
...
Рейтинг: 0 / 0
11.09.2014, 03:04:13
    #38743693
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cервер обработки сообщений
Дополнение к ТЗ ( 16562010 ): сервер получает беззнаковое 32 - разрядное целое и возвращает квадрат этого числа в беззнаковом 64м целом.
...
Рейтинг: 0 / 0
11.09.2014, 03:32:57
    #38743698
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cервер обработки сообщений
В общем, все вышеупомянутые .pas и inc файлы складываем в одно место и указываем Delphi, чтобы она это место знало (например, добавляем директорию в library path).

И так, сервер, готов:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
program ConsoleServer;

{$APPTYPE CONSOLE}

uses
  SysUtils, ZMQ;
var
  fContext: Pointer;
  fResponder: Pointer;
  fStatus: Cardinal;
  fInValue: Cardinal;
  fOutValue: UInt64;

begin
  fContext := zmq_ctx_new();
  fResponder := zmq_socket(fContext, ZMQ_REP);
  fStatus := zmq_bind(fResponder, 'tcp://*:5555');
  assert(fStatus = 0);
  Writeln('Starting...');
  while (True) do begin
    zmq_recv(fResponder, fInValue, SizeOf(fInValue), 0);
    Writeln('Received: ', fInValue);
    fOutValue := fInValue * fInValue;
    zmq_send(fResponder, fOutValue, SizeOf(fOutValue), 0);
  end;

end.


Сервер в цикле слушает порт №5555, читает из порта число и пишет значение квадрата числа.

Надеюсь, он будет работать безупречно. А пока он только компилируется, стартует и выводит Starting...
...
Рейтинг: 0 / 0
11.09.2014, 04:01:14
    #38743706
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cервер обработки сообщений
Клиент:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
program ConsoleClient;

{$APPTYPE CONSOLE}

uses
  SysUtils, ZMQ;

const
  c_iter = 999999;
var
  context: Pointer;
  requester: Pointer;
  i: Integer;
  f_ScrValue: Cardinal;
  f_qValue: UInt64;

begin
  Writeln('Client starting...');
  Randomize();

  context := zmq_ctx_new();
  requester := zmq_socket(context, ZMQ_REQ);
  zmq_connect(requester, 'tcp://localhost:5555');

  for i := 0 to c_iter do begin
    f_ScrValue := Random(-1);
    Writeln('Sending ', f_ScrValue);
    zmq_send(requester, f_ScrValue, SizeOf(f_ScrValue), 0);
    zmq_recv(requester, f_qValue, SizeOf(f_qValue), 0);
    Writeln('Received ', f_qValue);
  end;

  zmq_close(requester);
  zmq_ctx_destroy(context);
end.



Судя по выводимым сообщениям, все работает правильно.
...
Рейтинг: 0 / 0
11.09.2014, 04:02:04
    #38743707
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cервер обработки сообщений
Нужно убрать из циклов тормозящие Writeln(), запустить сервер на удаленном компе и оценить скорость работы с несколькими клиентами...
...
...завтра.
...
Рейтинг: 0 / 0
11.09.2014, 06:14:42
    #38743728
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cервер обработки сообщений
Меряю.
Разное количество клиентов. Клиенты запускаются и ждут, пока запустится сервер.
Сервер выполняет 1 млн запросов и выводит сообщение о времени выполнения.
...
При попытке выполнить 1024 коннекта получил сообщение "assertion failed fds.size() <= fd_setsize"...
Посмотрел в исходниках dll на этот самый fd_setsize - он там действительно FD_SETSIZE равен 1024.
Просто уменьшил число клиентов до 1000.
...
...
Рейтинг: 0 / 0
11.09.2014, 06:15:18
    #38743729
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cервер обработки сообщений
..
...
Рейтинг: 0 / 0
11.09.2014, 06:19:43
    #38743732
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cервер обработки сообщений
То есть, после двух сотен клиентов - на пределе, еле справляется.
Нужно попробовать разнести серверную части в несколько потоков.

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


Код: pascal
1.
2.
 zmq_connect(requester, 'tcp://Host1:5555');
 zmq_connect(requester, 'tcp://Host2:5555');


- и все. Запросы будут поочередно отсылаться разным серверам.
Но хочется выжать все из одного процесса сервера.
...
Рейтинг: 0 / 0
11.09.2014, 06:55:49
    #38743742
prog123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cервер обработки сообщений
чччДТо есть, после двух сотен клиентов - на пределе, еле справляется.
Нужно попробовать разнести серверную части в несколько потоков.

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


Код: pascal
1.
2.
 zmq_connect(requester, 'tcp://Host1:5555');
 zmq_connect(requester, 'tcp://Host2:5555');


- и все. Запросы будут поочередно отсылаться разным серверам.
Но хочется выжать все из одного процесса сервера.


Профилировщиком шмальни, где он супостат чешетца..
...
Рейтинг: 0 / 0
11.09.2014, 09:51:43
    #38743821
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cервер обработки сообщений
чччД,
А написать сервер на портах завершения ввода/вывода (IO completion ports)? Пишут, что это чуть не лучший вариант под Windows для обработки многих запросов.
http://msdn.microsoft.com/ru-ru/library/windows/desktop/aa365198(v=vs.85).aspx
http://habrahabr.ru/post/145140/
...
Рейтинг: 0 / 0
11.09.2014, 13:35:49
    #38744151
fd00ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cервер обработки сообщений
чччД, не пробовал в тот же сценарий запрячь что-либо из этого набора , чтобы потом можно было как-то сравнить результаты?
...
Рейтинг: 0 / 0
17.09.2014, 05:10:48
    #38748646
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cервер обработки сообщений
Интересно, что длина сообщений может быть любой (почти: Integer), просто короткие сообщения доставляются прямо в теле сообщения, а для длинных специально автоматически выделяется память и в сообщении - адрес начала блока.
После чтения следующего сообщения предыдущее "пропадает".
...
Рейтинг: 0 / 0
17.09.2014, 06:08:55
    #38748653
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cервер обработки сообщений
...в общем, выяснилось, что клиентов не будет больше сотни, и скорость обработки вполне приемлима.

...
~~~~~~~~~~~~~~~~~~~~~~~~

Таким образом, был рассмотрен режим обмена сообщениями по схеме "Запрос-Ответ" (Request-Reply).
Схема работы "Запрос-Ответ": сервер слушает сокет, принимает сообщения от всех желающих, и отвечает на запросы.

...
~~~~~~~~~~~~~~~~~~~~~~~~

Бывает, что нужно по-другому. Сервер должен оповестить клиентов о каком-то событии.
Клиенты отправляют серверу заявку, что они готовы получать сообщения о наступившем событии ("подписываются" на событие).
Одних клиентов могут интересовать одни события, других - другие.
А сервера вообще не волнует, кому из клиентов что нужно. Сервер - это как бы радиоприемник, вещающий в эфир. Кто слушает - молодец. А кто не слушает - тот ССЗБ.

Такая схема называется "Издатель - Подписчик" (Publisher-Subscriber).

Пример.

Автоматическая метеостанция измеряет температуру, атмосферное давление и скорость ветра. Результаты измерений время от времени (например, после завершения цикла измрений) передаются "всем заинтересованным лицам".
Кого-то интересует всё, кому-то нужна температура, кого-то волнует только скорость ветра.

Пишем код метеостанции (), то есть, сервер-издатель :
...
Рейтинг: 0 / 0
17.09.2014, 10:15:19
    #38748801
dred2k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cервер обработки сообщений
Через сокеты не тестил ? Synapse, к примеру.
Интересно, сильно уступит по скорости.
...
Рейтинг: 0 / 0
17.09.2014, 12:16:14
    #38748966
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cервер обработки сообщений
чччДА сервера вообще не волнует, кому из клиентов что нужно. Сервер - это как бы
радиоприемник, вещающий в эфир. Кто слушает - молодец. А кто не слушает - тот ССЗБ.
В смысле, используешь UDP broadcast или TCP multicast?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.09.2014, 15:59:06
    #38749337
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cервер обработки сообщений
Dimitry SibiryakovчччДА сервера вообще не волнует, кому из клиентов что нужно. Сервер - это как бы
радиоприемник, вещающий в эфир. Кто слушает - молодец. А кто не слушает - тот ССЗБ.
В смысле, используешь UDP broadcast или TCP multicast?

ZeroMQ вроде точно не использует UDP.
Как реализовано - можно посмотреть в исходниках libzmq.dll.

Прикладной программист выбирает транспортный уровень для сокета с помощью zmq_bind:

Код: pascal
1.
  zmq_connect(requester, 'tcp://localhost:5555');


...

Заявлено, что ZeroMQ позволяет обмениваться между разными системами "в сети", между процессами и между потоками в рамках процесса.

Я ничего, кроме tcp пока не пробовал.

В документации пишут, что в данны момент поддерживается работа на базе TCP, IPC (на POSIX), inproc, TIPC ("Transparent IPC" от Ericsson), SCTP, PGM, NORM и SOCKS5 (насчет последнего упоминают особо - типа, теперь ZeroMQ может и через сеть Tor ходить)
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Cервер обработки сообщений / 25 сообщений из 38, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]