Высокая доступность и масштабируемая платформа для Java/C++ на Solaris
-
09-06-2019 - |
Вопрос
У меня есть приложение, представляющее собой смесь 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).