Как я могу создать сервер UDP, который сможет масштабировать до 10000 (некоррелированных) соединений? - PullRequest
0 голосов
/ 15 февраля 2012

В настоящее время я экспериментирую с этим кодом (я знаю, что он не соответствует цели).Я попытался отправить из 3 источников одновременно (UDP Test Tool), и это нормально, но я не хочу знать, как это будет происходить, если из этих 10K возможных клиентов 2K отправляются одновременно?Размер пакетов составляет около 70 байтов.Я должен выполнить несколько простых операций над содержимым и записать результаты в базу данных.

открытый класс Test {

public static void main(String [] args){

    int PACKETSIZE=1400;
    int port=5555;
    byte[] bytes = new byte[PACKETSIZE];
    //ByteBuffer bb = ByteBuffer.allocate(4);
    //Byte lat=null;

    try
    {
    DatagramSocket socket = new DatagramSocket(port);
    System.out.println("The server is runing on port " + port +"\n");

        while (true)
        {
            DatagramPacket packet = new DatagramPacket(bytes, bytes.length);

            socket.receive(packet);

            System.out.println("Packet length = " + packet.getLength());                                                
            System.out.println("Sender IP = " + packet.getAddress() + "  Port = " + packet.getPort());
            for(int i=0; i<=packet.getLength();i++){System.out.print(" "+ packet.getData()[i] + " ");} 

Ответы [ 2 ]

2 голосов
/ 15 февраля 2012

Во-первых, сокеты UDP не ориентированы на соединения, поэтому количество «соединений» не имеет смысла.Число, которое вас действительно волнует - это число дейтаграмм в секунду.Другая проблема, которая обычно упускается из виду, заключается в том, охватывают ли дейтаграммы IP-пакеты или нет, поскольку это влияет на время сборки пакетов и, в конечном счете, на то, насколько дорогими они должны быть получены.Размер вашего пакета составляет 1400, что будет удобно вписываться в кадр Ethernet.

Теперь вам нужно ограничить время обработки, используя несколько потоков, очереди или какую-то другую схему обработки.Вы хотите, чтобы принимающий поток был занят извлечением дейтаграмм из сети и размещением их в другом месте для обработки рабочими.Это распространенная идиома, используемая годами.Он должен масштабироваться в соответствии с вашими потребностями при условии, что вы можете отделить обработку данных от сетевого ввода-вывода.

Вы также можете использовать асинхронный или управляемый событиями ввод-вывод, чтобы у вас не было потока, отвечающего за чтение дейтаграмм.из розетки напрямую.См. этот вопрос для обсуждения Java NIO.

Я не уверен, если это домашняя работа или нет, но вы должны прочитать Проблема C10K Отлично Дана Кегелястатья на эту тему.Я думаю, что вы, вероятно, найдете это по меньшей мере поучительным.

0 голосов
/ 15 февраля 2012

Проверьте эти два проекта с открытым исходным кодом:

Также проверьте этот пост в блоге: http://urbanairship.com/blog/2010/08/24/c500k-in-action-at-urban-airship/

...