суббота, 27 октября 2012 г.

Ubuntu автомонирование NTFS раздела

Понадобилось в Ubuntu, поключать( автомонтировать) раздел ntfs, при загрузке. Нашел рецепт http://vanoc.ru/ubuntu/avtomontirovanie-diskov-v-ubuntu/
Но он мне не помог,  при стартапе система ругалась и тупила.

Лекарство:
Сделать, всё как описано выше (отредактировать /etc/fstab),
но более детально расписать  информацию о разделе.

В таком виде, у меня заработало:
/dev/hda2 /media/windows ntfs-3g defaults,locale=ru_RU.utf8 0 0

Детально описанно здесь

https://help.ubuntu.com/community/Fstab


пятница, 5 октября 2012 г.

AeroSpike (Citrusleaf)

AeroSpike, он же Citrusleaf http://www.aerospike.com/
Распределенное хранилище данных, в виде ключ - значение.
Основной фичей является крайне быстрый поиск и передача записей.

Термины AeroSpike
Node - хост, на котором функционирует AeroSpike
Cluster - объединение нод в одном информационном пространстве
Name space - База данных (Data base) - в терминах SQL
Record - запись (row)
Bin - колонка

Есть бесплатная Community Edition версия, с ограничением размера кластера, не больше 2-х нод. Но и этого вполне хватает.

К AeroSpike прилагается умный клиент. Его легко встроить в своё приложение. Реализации SDK есть на Java, C#, Python, PHP.
Он отслеживает динамическое изменения кластера, управляет балансировкой нагрузки. Т.е делает всё сам.

Работать с данным SDK очень просто

//Создаем подключение
CitrusleafClient cc = new CitrusleafClient();
cc.addHost("10.1.1.60",3000);

//Добавляем запись
String namespace = "test";
ClResultCode rc = cc.set(namespace, "myset", "mykey",
                       "mybin", "myvalue", null, null);

//Считываем запись
ClResult cr = cc.get(namespace, "myset", "mykey", "name", null);
if (cr.result != null) {
    System.out.println("got name:" + cr.result);
}

Схема name space может динамически меняться. Для каждой записи, можно добавлять или удалять бины (колонки). Т.е по сути, никакой схемы нет...

Ноды сами занимаются репликацией данных, информация полностью дублируется на каждой ноде. Ноды могут динамически удаляться и добавляться в кластер. Потери данных происходить не должно.

Проблемы:
Пока не удалось запустить кластер из 2-х нод, на двух локальных виртуальных машинах (похоже проблемы с сетевыми мостами). Зато получилось это сделать в связке 1 нода - на виртуальной машине, 2-я на хосте. Всё работает. Кластер самоидентифицируется.

Производительность:
База, 100 000 записей, один запрос на чтение приходит за 0.6 ms
Шустро.

четверг, 4 октября 2012 г.

Java, RESTful Web Service.

В прошлом посте, для тестов использовался SOAP Web Service (javax.WS)
Время одного вызова в синхронном режиме занимало 43 ms.
В этот раз я протестировал RESTful / JSON Web Service (javax.RS), время обработки одного запроса, катастрофично упало до 2 ms.

SOAP всетаки тяжелая технология, подходит для тех, кому некуда спешить.

Как создать JSON Web Service
http://www.mkyong.com/webservices/jax-rs/restful-java-client-with-jersey-client/
http://www.mkyong.com/webservices/jax-rs/json-example-with-jersey-jackson/

среда, 3 октября 2012 г.

Java, Web Service и Асинхронность

      Совсем не давно возникла необходимость создать ассинхронный веб сервис. Я выяснил, что на самом деле асинхронность, это нечто чужеродное  для веб сервисов. Поэтому, если хотите асинхронности придется по извращаться. Ниже я опишу решения, которые удалось раскопать.

1. Асинхронный клиент для синхронного сервиса.
Данный подход, заключается в эмуляции асинхронности на стороне клиента.
Реализация хорошо описана здесь http://www.ibm.com/developerworks/ru/library/wes-0804_sedov/

От себя  добавлю, что необходимо, с помощью утилиты wsimport, создать обвертку из Java классов. Которую мы будем использовать в клиенте, для коммуникации с WS.

Вот так, можно сформировать обычную синхронную обвертку
wsimport -keep -verbose http://localhost:8080/AeroSpike?wsdl

Но нам нужны асинхронные методы. Для этого запускаем утилиту, с такими параметрами
wsimport -b binding.xml -keep -verbose http://localhost:8080/AsyncSpikeServiceImpl?wsdl

где binding.xml файл биндинга, следующего содержания

<bindings
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    wsdlLocation="http://localhost:8080/AsyncSpikeServiceImpl?wsdl"
    xmlns="http://java.sun.com/xml/ns/jaxws">
    <bindings node="wsdl:definitions">
         <enableAsyncMapping>true</enableAsyncMapping>
    </bindings>
</bindings>

В качестве wsdlLocation, может быть указан как URL, так и WSDL файл.
При этом, если у веб сервиса есть методы, помеченные аннотацией OneWay (т.е метод вызываемый в не блокирующем режиме), для таких методов асинхронные обвертки создаваться не будут.

Производительность
Сделал замеры производительности на клиенте. В синхронном режиме, на  один запрос уходит 43 ms. В асинхронном (с обратным вызовом AsyncHandler84 ms.



2. Дуплексный подход. Клиент - он же сервис обратного вызова.

Это самый правильный подход, базирующийся на спецификации WS-Addressing. С помощью него, можно организовать самую настоящую асинхронность. Выглядит это так:


 Веб сервису приходит запрос, в заголовке которого содержится адрес, на который нужно отослать ответ. Можно сейчас, а можно через неделю.
Одна беда, поддержка WS-Adressing есть не во всех контейнерах сервлетов, и существуют трудности с генерацией правильной обвертки. Как это сделать в Jetty, я так и не нашел.

Суть вопроса, хорошо раскрыта здесь, применительно к Oracle SOA Suite:
http://samolisov.blogspot.com/2012/05/blog-post.html

и здесь, для WebSphere
http://www.ibm.com/developerworks/ru/library/ws-JAXsupport/

А это для WebLogic:
http://docs.oracle.com/cd/E17904_01/web.1111/e13734/asynch.htm

А здесь просто много теории
http://docs.oracle.com/cd/E17904_01/web.1111/e13734/asynch.htm











вторник, 2 октября 2012 г.

Initialize

В этом блоге я буду писать заметки о программировании. Это хороший способ сохранить и систематизировать знания, которые валятся на меня в огромном количестве. Может быть, это будет полезно кому то еще.