понедельник, апреля 28, 2014

ActiveMQ Master/Slave and load balancer cluster

Пришло время объединить все технологии кластеризации ActiveMQ вместе, и продемонстрировать систему устойчивую к сбоям и позволяющую распределять нагрузку. Для примера построим архитектуру кластера на базе 8 инстансов ActiveMQ. Схема выглядит следующим образом.

Рассмотрим детально:

  • Инстансы связаные общим хранилищем Master/Slave 1-2, 3-4, 5-6, 7-8. По идее каждая пара разворачивается на отдельной машине. Для возможности развертывания на отдельной машине, все инстансы разнесены по портам.
  • С помощью Network Broker каждая пара с связана с каждой парой.
  • Для каждой пары на этом же хосте, с помощью Apache Camel поднимается HTTP точка, принимающая запросы от внешнего балансировщика и прокидывающая запрос в очередь.
  • Все инстансы из каждой группы могут делиться сообщения с другими группами
  • Отдельные клиенты разворачиваются каждый на своем хосте и читают сообщения и очереди.
  • Балансировщик для простоты тоже реализован с помощью Apache Camel
Ниже можно взглянуть на настройки каждого инстанса и исходный код.

четверг, апреля 24, 2014

ActiveMQ Master/Slave and Broker Networks cluster

В предыдущей статье мы рассмотрели высоко-нагруженый кластер ActiveMQ для распределения нагрузки. Однако эта конфигурация все таки обладает следующим недостатком. При выходе из строя одного из узлов ActiveMQ, сообщения размещенные в нем становятся более недоступны, и будут вычитаны только после того как конкретный инстанс ActiveMQ будет снова поднят. Проблема может быть решена с помощью конфигурации Master/Slave, в которой два, или больше инстанса ActiveMQ имеют общее хранилище. Пара Master/Slave может быть связана с аналогичной парой, размещенной на другом хосте, и связаны с помощью  Broker Networks. Схематично это выглядит следующим образом.
Для простоты развертывания все производится на одной машине. Инстансы ActiveMQ инстансы разделены по портам.
Ниже будут представлены настройки каждого из узлов кластера

понедельник, апреля 14, 2014

ActiveMQ high availability load balancer cluster

Рассмотрим актуальную задачу Load Balancer между инстансами ActiveMQ. Балансировка в таком случае строиться с помощью networkConnectors. Для простоты развертывания инстансы ActiveMQ развернем на одной машине, разделение будет строиться на базе портов. Вот схематичное представление кластера:

Конфигурация каждого инстанса ActiveMQ представлена ниже:

четверг, апреля 03, 2014

Transactional JMS Client

Разберемся детально с локальными транзакциями на примере взаимодействия JMS очередей (ActiveMQ). В документации по этому поводу говорится, что для того чтобы с route был транзакционным достаточно в начале объявить его с помощью инструкции <transacted/> . Но как будет выглядеть транзакционное поведение умалчивается. Обычно в качестве примера демонстрируется подобный route.

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <camelContext xmlns="http://camel.apache.org/schema/spring">
    <route>
      <from uri="jmstx:queue:okay"/>
      <transacted/>
      <to uri="jmstx:queue:final"/>
    </route>
  </camelContext>
</beans>
Который не демонстрирует ровным счетом ничего.

понедельник, марта 17, 2014

RESTFul with Apache Camel

После длительного перерыва, рассмотрим как реализовать с помощью Apache Camel простейший REST-сервис. Реализовать подобное с помощью Apache Camel можно навскидку 3-мя способами. Мне как раз был необходим сервис по хранению и управлению настройками в формате key=value. REST необходим чтобы в дальнейшем сделать на AngularJS страницу для управления настройками.
Итак Apache Camel предоставляет следующие возможности для реализации REST сервиса
  1. CXF Bean Component
  2. Restlet Component
  3. CXFRS Component
CXF Bean Component и CXFRS Component очень похожи друг на друга, и строятся на основе отдельного java-bean помеченного специальными аннотациями, и отличаются лишь обвязкой и инициализацией.Лично меня привлек CXF Bean Component который поддерживает из коробки одновременно два стандарта JAXRS, JAXWS. Что позволяет управлять выводом XML-JSON, плюс есть возможность использовать разработанный код для реализации SOAP WebService.
Сам код на Apache Camel очень лаконичен:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camel="http://camel.apache.org/schema/spring"
 xmlns:osgi="http://www.springframework.org/schema/osgi" xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd
       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

 <context:component-scan base-package="com.bssys.*" />
 
 <bean id="itemRestService" class="com.bssys.rest_service.ItemRestService" />
 
 <camelContext xmlns="http://camel.apache.org/schema/spring">
  <route>
   <from uri="jetty:http://localhost:8787?matchOnUriPrefix=true" />
   <to uri="cxfbean:itemRestService" />
  </route>
 </camelContext>
</beans>

Детали скрываются в реализации ItemRestService. Ниже я опишу полную последовательность разработки