Просмотр полной версии : "Зоопарк" на сервере - насколько это криминально?
mikhailk
24.04.2010, 11:56
Допустим, есть на 90% готовое приложение, и при начале работы над приложением никаких online-действий не планировалось. Поэтому сервер собран на связке php/memcache/mysql, обмен реализован по http, сервер отдает xml. Все более-менее работает и объективной потребности в переходе на сервер другой архитектуры нет.
Неожиданно в игру вводится новый функционал, а именно - пользователь, находясь в своей локации, может производить некоторые действия в отношении другого пользователя, которые тут же должны отражаться в его локации. Например, он выпускает в локацию второго пользователя "бандитов", которые там грабят ресурсы.
Требует решения ситуация, когда второй пользователь находится в игре. Можно заставить клиента лазить на сервер по таймауту (но с маленьким таймаутом имеем большую дополнительную нагрузку на сервер, а с большим - теряем online), а можно запустить "маленький сокет-сервер" на java , единственное назначение которого будет в том, чтобы "дернуть" клиента, чтобы тот, в свою очередь залез на сервер и обновил свои данные.
Кто-нибудь так делает?
поднимается слушающий сокет на серванте.
клиенты цепляются к нему fulltime.
каждый раз, когда это необходимо, сервер шлет по трубе команду клиенту, тот в зависимости от команды выполняет определенные действия. например, запрашивает на серваке данные.
ничего зазорного в этом нет и это самый быстрый и не ресурсоемкий способ
mikhailk
24.04.2010, 22:48
ок
так и сделаю
mikhailk
07.05.2010, 13:03
Еще возник вопрос по итогам ввода в эксплуатацию указанного зоопарка.
Сейчас организовано таким образом:
Приложение работает с сервером на php/memcache/mysql. Собственно, это немного производства и отправка поездов со своей станции на другие станции. Когда пользователь со станции внутри своего клиента отправляет поезд на станцию внутри другого клиента, то происходит обновление информации о местоположении поезда в базе, после чего клиенту, на который прибывает поезд, отправляется через сокет-сервер команда обновить поезда на своей станции, он лезет в базу и показывает у себя прибывающий поезд. Поскольку это не реалтайм, временные издержки приемлемые.
Обращение с базой реализуется исключительно на php, сокет-сервер на java работает в режиме маршрутизатора сообщений.
Возникла необходимость инициировать отправку сообщений на клиенты с требованием обновить контент у себя после обновления базы со стороны php. По списку, который сформирован по итогам обновления базы.
Умом понимаю, что можно доработать сокет-сервер, чтобы эту модификацию базы выполнял он сам, тогда и вопрос рассылки решится элементарно, но может есть способ проще?
Размерность списка идентификаторов для рассылки сообщений, думаю, в пределах 1000.
от не совсем врубился в проблему :(
mikhailk
07.05.2010, 15:41
по крону запускается php-скрипт, модифицирующий базу.
по итогам модификации возникает список модифицированных локаций (список userID)
этот список надо как-то передать сокет-серверу на java, чтобы он разослал клиентам по этому списку команду на обновление своих данных
естественно, рассылать нужно тем, кто в онлайне, но сокет-сервер это как раз знает
фактически, мне нужен, как подозреваю, сокет-клиент на php, который приконнектился бы к сокет-серверу на java
а есть возможность заставить сокет-сервер (модифицировать его код) генерить список модифицированных локаций (список userID) ?
membrilius
07.05.2010, 16:52
По-моему проще сделать что бы java-сервер сам это делал. Просто модуль прикрутить, который лез бы в базу и делал что ему там надо. Поставить там какой-нибудь механизм, что модуль выполнялся в какое-то определённое время..
Ну или да, сокет-клиент на php ... который бы запускался cron'ом, лез в базу, подключался к java-серверу и делал что ему нужно.. но это что-то очень странное..
Psycho Tiger
07.05.2010, 16:59
Переходите полностью на сокеты. Стояла такая же проблема недавно - обмозговав, перешли на сокеты. Сейчас вы потратите время соединяя эту проблему, завтра снова будет проблема, послезавтра ещё одна и т.д. Проще сделать сразу правильно.
mikhailk
07.05.2010, 18:44
да-да :)
это я уже понял
следующее приложение будет стоять на сокет-сервере целиком
В данном случае действительно разумнее перенести процедуру апдейта базы в сокет-сервер. Серверу MySQL, полагаю, все равно, кто в него лазит?
Crenth, список модифицированных локаций генерит как раз php-скрипт. Он мог бы класть, конечно, его в мемкэш, а сокет-сервер периодически через другой копеечный скрипт забирал бы из мемкеша этот список и обнулял бы его... Но так тоже какие-то костыли получаются. :)
membrilius
07.05.2010, 19:02
Я бы на самом деле из базы ничего не вытаскивал, только раз в 5 минут обновлял на случай рестарта сервера.
Просто при запуски сокет-сервера беру из базы все эти поезда и их местоположения и сохраняю их допустим в массиве... при изменениях роюсь в массиве и отдаю из него информацию (это быстрее чем в базе), при необходимости модифицирую информацию в массиве и в базе (на случай рестарта сервера).
вроде тоже не плохо.. но когда информации много, то куча массивов тоже не панацея.
Psycho Tiger
07.05.2010, 20:07
Сервер MySQL? Насколько мне известно это БД. И да, совершенно безразлично.
membrilius
07.05.2010, 21:19
Тогда уж СУБД ) На самом деле на сколько мне известно в *nix подобных система для связки допустим PHP, и МуСкула используя сокет /tmp/mysql.sock
Если его выгрузить из памяти, то при обращение к МуСкулу будет вылезать сообщение типа: "Can't connect to local MySQL server through socket...." Так что Сервер тоже играет роль... )
mikhailk
07.05.2010, 22:36
завтра проведу эксперимент по совместному доступу к одной БД MySQL из php и java.
завтра проведу эксперимент по совместному доступу к одной БД MySQL из php и java.
А в чём проблема может быть?
Проблема может быть только на уровне транзакций - а это не зависит от количества и качества клиентов базы.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.