У меня есть приложение, которое представляет собой смесь Java и C ++ в Solaris. Java-аспекты кода запускают веб-интерфейс и устанавливают состояние на устройствах, с которыми мы разговариваем, а код C ++ выполняет в реальном времени анализ данных, возвращаемых с устройств. Общая память используется для передачи информации о состоянии устройства и контекста из кода Java в код C ++. Код Java использует базу данных PostgreSQL для сохранения своего состояния.
Мы сталкиваемся с довольно серьезными узкими местами в производительности, и сейчас единственный способ масштабирования - это увеличить память и количество процессоров. Мы застряли на одном физическом боксе из-за конструкции с общей памятью.
По-настоящему большой успех здесь - это код C ++. Веб-интерфейс довольно легко используется для настройки устройств; где мы действительно боремся за обработку томов данных, которые устройства доставляют после настройки.
Каждая часть данных, которую мы получаем от устройства, имеет идентификатор, который указывает на контекст устройства, и нам нужно это найти. Прямо сейчас есть ряд объектов совместно используемой памяти, которые поддерживаются кодом Java / UI и на которые ссылается код C ++, и это узкое место. Из-за этой архитектуры мы не можем перенести обработку данных C ++ на другую машину. Нам необходимо иметь возможность масштабирования, чтобы различные подмножества устройств могли обрабатываться на разных машинах, но тогда мы теряем способность выполнять поиск по контексту, и вот эту проблему я пытаюсь решить: как разгрузить реальный время обработки данных для других блоков, но при этом они могут ссылаться на контекст устройства.
Должен отметить, что мы не контролируем протокол, используемый самими устройствами, и нет никаких шансов, что ситуация изменится.
Мы знаем, что нам нужно отойти от этого, чтобы иметь возможность масштабирования путем добавления большего количества машин в кластер, и я на начальных этапах работы над тем, как именно мы это сделаем.
Прямо сейчас я рассматриваю Terracotta как способ масштабирования Java-кода, но я не дошел до того, как решить, как масштабировать C ++ для соответствия.
Помимо повышения производительности мы должны учитывать и высокую доступность. Приложение должно быть доступно практически все время - не совсем на 100%, что неэффективно с точки зрения затрат, но мы должны сделать разумную работу, чтобы пережить сбой машины.
Если бы вам пришлось выполнить задание, которое мне дали, что бы вы сделали?
РЕДАКТИРОВАТЬ: Основываясь на данных, предоставленных @john channing, я смотрю на GigaSpaces и Gemstone. Похоже, что Oracle Coherence и IBM ObjectGrid доступны только для java.