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

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

public class 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] + " ");} 

person V4R15    schedule 15.02.2012    source источник


Ответы (2)


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

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

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

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

person D.Shawley    schedule 15.02.2012

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

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

person Yazan Jaber    schedule 15.02.2012