2014-10-27 2 views
0

У нас есть парк из более чем 50 000 автомобилей в стране, и мы собираемся отслеживать наши автомобили, используя GPS-устройства (а не мобильные устройства), закрепленные в автомобилях , местоположение будет получено сервером tcp, указав ip и порт сервера.Как написать TCP-сервер, используя C# с одновременными подключениями в любое время

Одним из основных требований является одновременное подключение, каждый автомобиль будет обновлять свое местоположение каждую минуту, так что кто-нибудь, кто столкнулся с написанием TCP-сервера на основе 50 000 автомобилей, расскажет, сколько одновременных соединений я могу получить (просто идея) в любое время. Как я могу проверить это, я имею в виду, как я могу загрузить тестовый сервер tcp.

Если вы знаете какой-либо .net библиотеку, которая может быть полезной, пожалуйста, руководство, я видел IPDaemon от www.nsoftware.com, и они утверждают,

По умолчанию каждый экземпляр IPDaemon может обрабатывать до 1000 одновременных входящих соединений (это число может быть увеличено до 100 000 или уменьшено до более низкого значения с помощью настройки конфигурации MaxConnections ).

Так что я смущен и ценю опытных друзей совета по этому вопросу.

Благодаря

+0

Вы имеете в виду, если 50 тыс. Автомобилей будут отправлять данные каждую минуту, сколько сетевых соединений это означает в любое время? Вы можете принимать 50000/60 для соединений в секунду, учитывая, что прием данных займет 1 секунду, и каждую минуту они отправляют данные, что составляет 833 взаимных соединения в секунду. Конечно, это среднее число, которое нужно сохранить, я бы сказал, возьмите 5 раз. – Vajura

+0

@ Ваджура, да, вы поняли, что пишу, я спрашиваю о средних соединениях с соглашением. – Shax

+0

, тогда вы можете принять эту рекомендацию, если автомобиль arent синхронизирован каким-либо образом, то это должно быть результатом, я также думаю, что совпадающие соединения никогда не должны быть выше 1500 – Vajura

ответ

0

Соединительные соединения никогда не должны быть выше 1500 (99,99%). Нет реального способа загрузить тест, а затем выполнить его в реальной системе. Его математическая проблема, и вы можете решить ее как таковую.

У вас есть 50000 автомобилей, которые посылают сигнал каждые 60 секунд, который длится 1 секунду (возможно, меньше, что приведет к еще менее сочным соединениям). Поскольку отправка сигнала не синхронизирована (я думаю, что arent посылает сигнал в одно и то же время), поэтому они будут более или менее расположены так, чтобы вы получили 833 соединения в секунду, что составляет 50 к/60. Теперь позвольте сказать, что вы получаете «неудачу», и 2000 автомобилей включаются в одно и то же время (или ровно на 60 секунд друг от друга), тогда вы получите 2000 одинаковых соединений за время, когда эти автомобили включены, что крайне маловероятно. Как я уже сказал, вы можете использовать 1500 взаимоувязанных соединений в качестве своего максимума, но для того, чтобы действительно экономить, увеличьте его до 3000 или 4000, чего никогда не должно было случиться.

Это все считается, что компьютер займет 1 секунду, чтобы разрешить один сигнал, и на самом деле это время должно быть ближе к 0,1 с или даже ниже, что приведет к 10-кратным разным соединениям, поэтому моя реальная догадка о абсолютном максимальном согласии соединения должны быть около 500.

+0

Как это может быть принятым ответом? Это так неправильно во многих отношениях. Почему у вас никогда не будет более 1500 одновременных соединений в первую очередь? Откуда берутся эти цифры? Вы не можете просто взять какие-либо цифры, сделать магическую математику и сказать, что это ограничения. Нет проблем с наличием 50 000 ** одновременных ** соединений в C# с правильно спроектированным кодом сервера. Если каждая передача GPS длится, например, 10 секунд, и каждая передача делает ее собственным подключением только на этот период, вы можете легко обрабатывать что-то вроде 250.000+ источников, учитывая некоторую «тайтовую» обработку таймаута. –

0

Если единственное, что вам нужно отправить является позиция и некоторые метаданные, идут с простым сервером HTTP. Их много на рынке, и большинство из них действительно эффективны: управление 50 000 клиентов не должно быть проблемой, это не так уж и много.

Я рекомендую вам не изобретать велосипед или использовать что-либо слишком сложное. Простое приложение ASP.NET MVC должно сделать трюк.

+0

это устройства, как они будут использовать HTTP, например, если я создаю REST API, как я буду назначать устройства, это не мобильные телефоны. Другое дело, что HTTP-ответ и заголовки Request создают нагрузку на данные, которые будут поглощать данные, разрешенные на сим-карте. что вы скажете об этом, пожалуйста? – Shax

+0

Могу сказать, что TCP также увеличивает нагрузку на данные, поэтому вы должны использовать UDP. Не ждите, это тоже добавляет нагрузки, поэтому вы должны создать свой собственный легкий протокол! Серьезно, эти протоколы не так тяжелы, как вы думаете, и очень мало случаев, когда это может быть реальной проблемой. Вы можете быть в одном из этих случаев, но это маловероятно. – Falanwe

+0

@Falanwe - проблема в том, что для подключения TCP требуется 7 рукопожатий, чтобы открыть и закрыть соединение.Кроме того, это тривиальное количество данных полезной нагрузки - идентификатор транспортного средства и GPS-координаты. Я также подозреваю, что протокол без установления соединения, такой как UDP, будет лучше. для этого требования. –

0

Избегайте поддерживать нить за соединение, а вместо этого используйте Asynchronous Programming Model. Это означает использование таких методов, как BeginConnect(), BeginRead() и BeginWrite(), а также их соответствующие методы EndXXX вместо альтернатив блокировки.

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

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

См. this или this для примеров того, как писать асинхронные серверы сокетов в C#.

+0

Если используется .NET 4.5, я бы рекомендовал вместо этого методы Async. то есть ConnectAsync, WriteAsync и т. д. Они не основаны на TPL, а на базовой модели портов ввода-вывода. Следовательно, меньше ресурсов ресурсов по сравнению с методами типа Begin/End. – jgauffin

+0

Асинхронные методы не подходят для параллелизма; они предназначены для одиночной асинхронной операции. – Gigi

+0

Разве вы не читали, что я сказал? Методы сокетов НЕ основаны на TPL. то есть не возвращать 'Task'. Они завершают порты ввода-вывода IO, которые отображаются в WinAPI. – jgauffin

-1

Если .Net не является жестким требованием, я предлагаю вам ознакомиться с NodeJs. Он довольно легкий и становится довольно развитым.

И, как сказал Фаланве, 50 000 соединений в минуту не так много, если это только данные о местоположении, которые они отправляют. Это в основном ограничено вашей пропускной способностью. Не так много обслуживания на компьютере.

-1

Я думаю, что ваша самая большая проблема заключается не в TCP-соединениях с GPS-трекерами, а в обработке баз данных. Объем данных, которые вы будете иметь при сохранении всех данных местоположения за 1 год, является массовым. И производительность сервера базы данных будет очень важна.

Также: как вы будете управлять, и что вы будете делать с данными, которые вы собираете? Вам необходимо будет создать интеллектуальные уведомления и фильтры данных для извлечения данных, необходимых для управления вашим флотом.

У меня есть большой опыт создания GPS следящих серверов & Управление флотами. Если у вас есть вопросы, не стесняйтесь обращаться ко мне.

Смежные вопросы