Высокая доступность и масштабируемая платформа для Java/C++ на Solaris

StackOverflow https://stackoverflow.com/questions/51266

Вопрос

У меня есть приложение, представляющее собой смесь 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.

Это было полезно?

Решение

Первое, что я бы сделал, — это построил модель системы, чтобы отобразить поток данных и попытаться точно понять, где находится узкое место.Если вы можете смоделировать свою систему как трубопровод, то вы сможете использовать теорию ограничений (большая часть литературы посвящена оптимизации бизнес-процессов, но она в равной степени применима и к программному обеспечению) для постоянного повышения производительности и устранения узких мест.

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

Тогда я бы использовал Принцип Парето (правило 80/20) выбрать небольшое количество вещей, которые принесут наибольшую выгоду, и сосредоточиться только на них.

Чтобы масштабировать приложение Java по горизонтали, я использовал Когерентность Oracle обширно.Хотя некоторые считают это очень дорогим. распределенная хеш-таблица, функционал гораздо богаче и можно, например, напрямую обращаться к данным в кеше из код С++ .

Другими альтернативами горизонтального масштабирования вашего кода Java могут быть Гига Пространства, Сетка объектов IBM или Драгоценный камень.

Если ваш код C++ не имеет состояния и используется исключительно для обработки чисел, вы можете рассмотреть возможность распределения процесса с помощью ЛЕД Сетка который имеет привязки для всех используемых вами языков.

Другие советы

Вам нужно масштабироваться вбок и наружу.Может быть, что-то вроде очередь сообщений может быть серверной частью между интерфейсом и процессором.

Эндрю (помимо моделирования конвейера и т. д.) важно измерять вещи.Вы запускали профилировщик кода и получали показатели того, где проводится большая часть времени?

Что касается кода базы данных, как часто он меняется?Вы сейчас рассматриваете кэширование?Я предполагаю, что вы просматривали индексы и т. д. поверх данных, чтобы ускорить работу БД?

Какой уровень трафика у вас на переднем конце?Вы кэшируете веб-страницы?(Нетрудно сказать, что для связи между компонентами используйте API типа JMS.Затем вы можете разместить компонент веб-страницы на одном компьютере (или нескольких), а затем разместить код интеграции (С++) на другом, и для многих продуктов JMS обычно существуют собственные API C++, т.е.На ум приходит ActiveMQ), но действительно полезно знать, сколько времени уходит на работу в Интернете (JSP?), C++, операциях с базой данных.

Хранит ли база данных бизнес-данные или она также используется для передачи данных между Java и C++?Вы говорите, что используете общую память, а не JNI?Какой уровень многопоточности сейчас существует в приложении?Как бы вы описали этот код: синхронный по своей природе или асинхронный?

Существует ли физическая связь между кодом Solaris и устройствами, которые необходимо обслуживать (т.все ли устройства регистрируются с помощью кода C++ или это можно указать).то есть.если бы вы установили балансировщик веб-нагрузки на интерфейс и просто подключили 2 машины сегодня, какова связь между тем, какие устройства управляются блоком, инициализированным заранее или заранее?

Каковы требования к HA?то есть.просто указать информацию?Можно ли выполнить высокую доступность только на веб-уровне путем кластеризации данных сеанса?

БД работает на другом компьютере?

Насколько велика БД?Оптимизировали ли вы свои запросы, т.е.пробовал использовать явные внутренние/внешние соединения, иногда помогает по сравнению с вложенными подзапросами (иногда).(еще раз посмотрите на статистику sql).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top