Думайте MUDs/MUCK, но, возможно, с аватарами или языковыми иллюстрациями. Мой язык выбора рубин.
Мне нужно обрабатывать несколько постоянных соединений с асинхронной передачей данных между сервером и его различными клиентами. Единая база данных должна быть обновлена на основе активности, происходящей на клиентских сеансах. Активность в каждом сеансе клиента может потребовать немедленного обновления нескольких других клиентов (пользователь входит в комнату, пользователь отправляет другому пользователю личное сообщение).
Это проект цели и учебный проект, поэтому я намерен повторно изобрести колесо или два, чтобы узнать больше о параллельном сетевом программировании. Однако я новичок как в параллельном, так и в сетевом программировании; ранее я работал почти исключительно в мире непостоянных синхронных HTTP-запросов в веб-приложениях. Поэтому я хочу убедиться, что я изобретаю правильные колеса.
Per emboss отличный ответ, я начал смотреть на внутренности определенных HTTP-серверов, поскольку веб-приложения обычно могут избегать проблем с потоками из-за того, насколько тщательно проблема абстрагируется самими серверами.
Я не хочу использовать EventMachine или GServer, потому что я еще не понимаю, что они делают. Когда у меня есть общее представление о том, как они работают, какие проблемы они решают и почему они полезны, я буду чувствовать себя комфортно с ним. Моя цель здесь заключается не в том, чтобы "написать игру", а "написать игру и узнать, как работают некоторые элементы более низкого уровня". Я также не понимаю границ определенных терминов; например, является ли "приложения с подключением к вводу/выводу" дополнением к "приложениям, управляемым событиями"? И наоборот?
Я, конечно, интересуюсь одним правильным способом для достижения своей цели, если она существует, но в целом я хочу понять, почему это правильный путь и почему другие способы менее предпочтительны.
Любые книги, электронные книги, онлайн-ресурсы, примеры проектов или другие лакомые кусочки, которые вы можете предложить, - это то, что я действительно переживаю.
То, как я делаю сейчас, - это использовать IO#select
для блокировки списка подключенных сокетов с таймаутом 0,1 секунд. Это заставляет любую информацию считывать в потокобезопасную очередь чтения, а затем всякий раз, когда она попадает в таймаут, она извлекает данные из потоковой очереди записи. Я не уверен, что тайм-аут должен быть короче. Существует второй поток, который опросает очередь чтения потоков сокета и обрабатывает "запросы". Это лучше, чем то, как я работал вначале, но все же может быть не идеальным.
Я разместил этот вопрос в Hacker News и связался с несколькими ресурсами, над которыми я работаю; ничего подобного было бы здорово: