Как спроектировать клиент-серверный архитектор - PullRequest
1 голос
/ 28 декабря 2010

Мне нравится знать серверную (основанную на TCP) архитектуру для поддержки большого количества клиентов (не менее 10 КБ) для реализации сервера Fix. Мои очки Как мы это проектируем. Как слушать на открытом порту? Используйте выбор или опрос или любую другую функцию. Как обработать ответ клиента? В больших масштабах мы не можем создать один поток для каждого клиента. Если обработка ответа выполняется в другом исполняемом файле, то совместно используйте запрос и ответ на исполняемый файл сервера через IPC. На этом есть намного больше. Буду признателен, если кто-нибудь объяснит это или предоставит какую-либо ссылку. Спасибо

Ответы [ 3 ]

2 голосов
/ 28 декабря 2010

Отличным источником информации по этой теме является Проблема C10K . Хотя размеры там кажутся немного старыми, методы все еще применимы сегодня.

1 голос
/ 28 декабря 2010

Архитектура зависит от того, что вы хотите сделать с входящими данными клиентов. Я предполагаю, что для каждого входящего сообщения вы выполняете некоторые вычисления и, вероятно, также возвращаете ответ.

В этом случае я бы создал 1 основной поток прослушивателя, который получает все входящие сообщения (на самом деле, если ваше оборудование имеет более 1 физического сетевого устройства, я бы использовал поток прослушивателя на устройство и удостоверился, что каждый из них прослушивает конкретное устройство). Получите количество процессоров, которые у вас есть на вашем компьютере, и создайте рабочие потоки для каждого процессора и свяжите их каждый поток с одним процессором (возможно, количество рабочих потоков должно быть num_of_cpu-1, чтобы оставить доступный процессор для слушателя и диспетчера).

У каждого потока есть очередь и семафор, основной поток слушателя просто помещает входящие данные в эти очереди. Есть много способов выполнить балансировку нагрузки (об этом поговорим позже).

Каждый рабочий поток работает только с данными запросами и помещает ответ в другую очередь, считываемую диспетчером.

Диспетчер - здесь есть 2 варианта: использовать поток для диспетчера (или поток для каждого сетевого устройства, как для слушателей), или же диспетчер должен быть тем же потоком, что и слушатель. Некоторое преимущество заключается в том, что они оба размещаются в одном потоке, поскольку это облегчает обнаружение потерянного соединения с сокетом и использование одних и тех же fds для чтения и записи без синхронизации потока. Однако может случиться так, что использование 2-х разных потоков даст лучшую производительность, его нужно протестировать.

Примечание о балансировке нагрузки: Это отдельная тема. Самое простое - использовать одну очередь для всех рабочих потоков, но проблема в том, что они должны блокироваться, чтобы извлекать элементы, и блокировка может ухудшить производительность. (Но вы получаете максимально сбалансированную нагрузку).

Другим довольно простым подходом было бы иметь личную очередь для каждого работника и выполнять циклический перебор при вставке. После каждого цикла X проверяйте размер всех очередей. Если некоторые очереди намного больше, чем другие, оставьте их для следующих циклов X, а затем снова проверьте их. Это не лучший подход, но он прост в реализации и дает некоторую балансировку нагрузки, когда блокировка не требуется.

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

Надеюсь, это поможет, Парень

0 голосов
/ 28 декабря 2010

Если клиент и сервер находятся в защищенной сети, то аспект безопасности должен быть минимальным - в той степени, в которой передачи зашифрованы. Если клиенты и сервер не находятся в защищенной сети - сначала вы хотите, чтобы сервер и клиент аутентифицировали друг друга, а затем инициировали зашифрованную передачу данных. Для передачи данных достаточно проверки на стороне сервера. В конце этой аутентификации используйте ключ сеанса для генерации потока зашифрованных данных (симметричный). рассмотрите использование TFTP, это просто осуществить и масштабируется достаточно хорошо.

...