Как управлять большим количеством TCP-соединений с использованием ASP.NET и C # - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть приложение, которое подключается к стороннему серверу, назовем его Server-A.Мне дали четыре разных порта, то есть 4000, 40001, 40002, 40003. На каждом порту я могу создать 20 соединений, чтобы я мог создать всего 80 соединений с сервером-A.Я хочу создать сервисный уровень, который должен взаимодействовать с сервером A по указанным портам.Технология будет asp.net C #.

Постановка проблемы

1- Приложение должно быть неблокирующим / асинхронным, чтобы обрабатывать от 10 до 20 миллионов запросов в день

2- Всякий раз, когдаСервисный уровень запускает создание 20 соединений на каждый порт.(Всего 80 подключений)

2- Все подключения должны оставаться подключенными / активными 24/7 и переподключаться всякий раз, когда какие-либо подключения прекращаются / отключаются.Он будет отправлять сообщение пульса в простое.

Мои вопросы

  • Как я могу управлять этим соединением?Стоит ли добавлять их в статический список один за другим, если TCP-сокет успешен?
  • Как узнать, что определенное соединение сброшено / отключено?
  • Как я могу отправлять определенные запросы на разные порты?Скажем, если a> b отправит его на порт 4000, то если a <= b отправит его на 4001 </li>
  • Как я могу сделать это асинхронным?

Для первоначального запуска я создал одно TCP-соединение на одном порту, и оно работает как положено.Затем я повторил тот же код для другого порта, но я знаю, что это очень плохой подход, и мне нужно скопировать один и тот же код 80 раз, чтобы сделать 80 соединений.Мне нужен чистый и масштабируемый способ добиться этого, чтобы в будущем я мог увеличить соединение до 100 или более.Есть ли рамки, которые я могу использовать?Любая помощь будет высоко оценена.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

@ Kartoos Khan, я сделал несколько сервисов с этими требованиями, и использование асинхронных методов - лучший способ создания высокопроизводительных сервисов в C #, потому что:

  • Он не блокирует периферию ввода-вывода, так какмогут быть розетки.
  • Минимизируйте потоки и улучшите производительность.

Позвольте мне порекомендовать вам книгу Написание высокопроизводительного кода .NET .Глава 4, Асинхронное программирование содержит информацию, которую вы должны знать для повышения производительности.

По моему опыту, это мои рекомендации:

  1. Создать основную угрозу для обработки основной программы.

  2. Создать класс для обработки Socket Server, который реализует асинхронный процесс для приема соединений, используя методы BeginAccept и EndAccept, здесь - пример того, как его использовать.Создайте другой класс для обработки соединений с сокетом, который имеет в качестве свойства объект Socket.

    2.1 создает метод для запуска процесса чтения, который будет вызываться классом Server для запуска связи междуконечные точки.Этот метод запустит процесс чтения в асинхронном режиме.

    2.2 Для чтения и записи асинхронным способом необходимо получить NetworkStream из сокета и использовать методы BeginRead иEndRead для получения данных и BegineWrite и EndWrite для отправки данных. Здесь есть документация.

В случае, если вашей службе требуется только подключение к серверу, игнорируйте шаг 1 и реализуйте класс Client, чтобы начать подключение к определенной конечной точке.

Используйте класс коллекции, например, коллекцию Dictionary, Key-Value-Pair , для хранения каждого класса клиента и использования идентификатора сокета в качестве ключа для доступа к каждому клиенту.Класс.

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

Основная программа будет отвечать за создание каждого клиентского сервера и настройку конечной точки каждого клиента по мере необходимости, а также начнет подключение каждого из них.В этом случае TCPClient позволяет запустить асинхронный процесс подключения, используя методы BeginConnect и EndConnect.

Здесь вы можете увидеть более подробную информацию об этой проблеме.

Я надеюсь, что это может быть полезно для вас.

0 голосов
/ 21 сентября 2019

Для обработки такого большого объема трафика вам нужно сделать несколько вещей.

Допущения

  • Вы подключаетесь к серверу другого клиента.
  • Выиметь большой объем веб-трафика с нескольких компьютеров или с нескольких рабочих процессов на любом компьютере.
  • Вы знаете, как создавать объекты клиент-сервер TCP и обрабатывать соединения.

Для менее чем 80 рабочих потоков на ваших серверах:

  • Поскольку каждый поток обрабатывается синхронно, вам нужно использовать только одно соединение для каждого потока.
  • Если не работает ни один веб-серверболее 20 рабочих процессов, тогда вы можете назначить один порт для каждого сервера для использования.Вставьте порт в файл web.config в качестве переменной и используйте его при создании соединений.Вы никогда не достигнете предела.
  • Сохраните ваше соединение в общем объекте, который может использовать все приложение (может поместить это в слой BLL), и если у вас есть ошибка соединения, заново создайте новое соединение наэта нить.

Для более чем 80 рабочих потоков на ваших серверах:

  • Сделайте то же самое, что и на последнем шаге, но на этом этапе вам нужно либо договориться о большем количестве соединений, либо выдобавьте новый слой между вашим приложением и сервером, который вы хотите достичь.
  • Этот второй уровень выступает в качестве посредника для двух сторон и может вместо этого управлять пулом подключений, а также отбирать подключение каждый раз, когда вам необходимо получить доступ к Серверу-A, и по окончании помещать его обратно в пул.
  • Каждый раз, когда вы подключаетесь к приложению-брокеру, создайте новый поток для обработки, пока соединение не будет разорвано или закрыто.
  • Следите за своими открытыми соединениями и альтом, у вас может быть столько клиентов, сколько вам нужно, но вашим узким местом будут эти 80 подключений, даже если у вас есть сотни или тысячи.
...