Я работаю над веб-приложением, которое часто требует выполнения интенсивных вычислений, результаты которых хранятся в отдельной таблице.Используя MySQL, этот запрос занимает около 500 мс (как можно лучше оптимизирован, поверьте мне).Чтобы устранить это узкое место, я создал программу на Java, которая загружает соответствующие данные БД в память и выполняет сам запрос;это занимает около 8мс (чем я немного горжусь).Я хотел бы использовать эту Java-программу для получения результатов, и, если она не работает или недоступна, при переходе PHP к выполнению MySQL-запроса.
Поскольку загрузка данных в приложение Java занимает некоторое время, этособирается загрузить его один раз и продолжить работу в качестве фонового процесса. Теперь вопрос заключается в том, как мне общаться с этим Java-приложением через PHP?
Имейте в виду:
- Возможно, для связи с несколькими экземплярами PHP потребуетсяэтот процесс Java одновременно.
- Если экземпляр Java не может быть найден (например, по какой-то причине происходит сбой), PHP должен прогрессировать, используя более старый и более медленный метод MySQL.
- Промежуточный процесс, такой какв качестве Memcache это приемлемо.
- В идеале решение должно выдерживать условия гонки.
- Я бы предпочел не использовать MySQL в качестве посредника.
Я былбудет использовать Memcache, где PHP будет писать в известный ключ и опрашивать, пока этот ключ не изменится на «завершено», в то время как Java будет опрашивать этот ключ и, как только найдет что-то, выполнить задание и установить его как «выполненное».Однако это не сработает по двум причинам.Во-первых, и PHP, и Java читают / записывают в Memcache с использованием сериализованных объектов, и изменить это невозможно, и я не хочу, чтобы Java десериализовала объекты PHP и наоборот - это слишком грязно.Во-вторых, это не совместимо с ACID - если очередь будет создана, то будут условия гонки.
На данный момент я застрял с опросом MySQL «выбирает», чтобы увидеть, находится ли задание вне очереди или нет, что далеко от оптимального решения, потому что время опроса должно быть медленнее, чтобы MySQL не пинговался слишком часто.Мне нужно лучшее решение!
Спасибо.
Редактировать: Дух.Похоже, я буду использовать какой-то SocketServer в Java, с которым я незнаком.Пример может помочь:)