Как мне спроектировать свой (в основном) текстовый игровой сервер?

Подумайте о MUD / MUCK, но, возможно, с аватарами или иллюстрациями локали. Я предпочитаю язык ruby ​​.

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

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

Пер emboss отличный ответ, я начал изучать внутреннее устройство некоторых HTTP серверов, поскольку веб-приложения обычно могут избежать проблем с потоками из-за того, насколько тщательно проблема абстрагируется самими серверами.

Я не хочу использовать EventMachine или GServer, потому что я еще не понимаю, что они делают . Когда я получу общее представление о том, как они работают, какие проблемы решают и почему они полезны, я буду чувствовать себя комфортно. Моя цель здесь не «написать игру», а «написать игру и узнать, как работают некоторые вещи нижнего уровня». Мне также неясны границы определенных терминов; например, являются ли «приложения с несвязанным вводом-выводом» надмножеством «приложений, управляемых событиями»? Наоборот?

Меня, конечно, интересует Единственный правильный способ достижения моей цели, если он существует, но в целом я хочу понять , почему это правильный путь и почему другие способы менее предпочтительны .

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

Я сейчас делаю что-то, используя IO # select для блокировки в списке подключенных сокетов с таймаутом 0,1 секунд. Он помещает любую прочитанную информацию в потокобезопасную очередь чтения, а затем, когда достигает тайм-аута, извлекает данные из поточно-безопасной очереди записи. Я не уверен, должен ли тайм-аут быть короче. Есть второй поток, который опрашивает очередь чтения потока, обрабатывающего сокеты, и обрабатывает «запросы». Это лучше, чем у меня изначально, но все же может быть не идеально.

Я разместил этот вопрос в Hacker News и получил ссылку на несколько ресурсов, над которыми я работаю; что-нибудь подобное было бы замечательно:

18
задан Community 23 May 2017 в 11:53
поделиться