Статьи

Multiverse: программное обеспечение с открытым исходным кодом, транзакционная память для Java. Интервью с создателем

Сегодня мы рады пообщаться с создателем Питера Вентьером и ведущим разработчиком очень интересного проекта с открытым исходным кодом Multiverse.

Привет Питер! Спасибо, что  нашли время поговорить с DZone .  W гип не начать с говоря нам немного о том, что Мультивселенная является

Привет, Алекс, Multiverse — это реализация программной транзакционной памяти для платформы Java, над которой я работаю последние 18 месяцев. Он имеет 2 важных миссии:

1) Создать STM, который легко интегрируется с языком Java

2) Создать STM, который можно интегрировать с другими JVM, такими как Scala, Groovy или JRuby.

Программная транзакционная память. Это звучит здорово. Что оно делает?

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

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

Может быть, вы хотите поделиться с нами некоторым фрагментом кода, чтобы немного лучше понять концепцию?

Это простой пример банковского счета:

public class Account{
private int balance;

public Account(int balance){
setBalance(balance);
}

public int getBalance(){ return balance; }

public void setBalance(int newBalance){
if(newBalance < 0){
throw new IllegalStateException("negative balance not allowed");
}
balance = newBalance;
}
}

Если эта учетная запись используется несколькими потоками, могут начаться странные вещи. Если 2 потока хотят перевести деньги со счета, оба прочитайте баланс, удалите сумму и запишите новый баланс. Если на счете 10 евро, и обе потоки хотят перевести 5 евро, результат в итоге составит 0 евро. Но если это делается одновременно, может случиться так, что конечный результат составит 5 евро. Это вызвано проблемой гонки, и это одна из самых сложных частей параллельного программирования: выяснение того, что нужно заблокировать. Стандартным решением было бы посыпать код синхронизированными, например:

public class Account{
private int balance;

public Account(int balance){
setBalance(balance);
}

public synchronized int getBalance(){
return balance;
}

public synchronized void setBalance(int newBalance){
if(newBalance < 0){
throw new IllegalStateException("negative balance not allowed");
}
balance = newBalance;
}
}

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

synchronized(account){

int balance = account.getBalance();

account.setBalance(balance-amount);

}

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

Итак, как STM помогает здесь?  

Пример объясняет более тысячи слов

@TransactionalObject
public class Account{
private int balance;

public Account(int balance){
setBalance(balance);
}

public int getBalance(){return balance;}

public void setBalance(int newBalance){
if(newBalance < 0){
throw new IllegalStateException("negative balance not allowed");
}
balance = newBalance;
}
}

Добавляя аннотацию «TransactionalObject», STM будет следить за тем, чтобы не возникало проблем с гонкой. Все методы экземпляра Аккаунта стали атомарными, и самое интересное в том, что они также могут быть созданы без боязни зайти в тупик, например:

@TransactionalMethod
public static void transfer(Account from, Account to, int amount){
from.setBalance(from.getBalance()-amount);
to.setBalance(to.getBalance()+amount);
}

Так что как разработчик вы можете работать в декларативном режиме; вы указываете, что должно быть транзакционным, и STM обеспечит его реализацию. Это похоже на модель программирования базы данных, где вы можете определить уровни изоляции, а база данных убедиться, что они не нарушены.

Что произойдет, если одна из операций не удалась?

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

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

Это звучит слишком хорошо. Какую цену мы платим за такие вкусности? Производительность?

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

Вы используете аннотации Java и рассказываете нам об инструментальных средствах кода, поэтому, возможно, вам понадобится некоторая предварительная обработка байт-кода агента или посткомпиляции. Как это работает?

Очень хороший вопрос Если вы хотите иметь бесшовную интеграцию с языком программирования Java, необходима некоторая форма инструментария. Для версии 0.4 доступен Javaagent, но для версии 0.5 также будут предоставлены инструменты компиляции. Javaagents отлично подходят для сред разработки, но вы не хотите, чтобы они работали.

Одним из утверждений миссии Multiverse является предоставление реализации STM, которая может быть легко интегрирована с другими языками, поэтому фактическая реализация STM заботится только об интерфейсах, так что вы можете полностью обойти инструментарий. И чтобы сделать это еще проще, я предоставил управляемую справку, которая не зависит от контрольно-измерительных приборов. Это  подход, используемый в проекте Akka на базе Scala Йонаса Бонера.

Этот термин напоминает мне еще один вопрос: как бы вы сравнили STM с другими подходами к  параллелизму? проблемы, такие как асинхронная передача сообщений от Erlang или управляемые  ссылки к постоянным структурам данных, популяризируемым Clojure?

Это более сложный вопрос. Если вы используете модель, основанную исключительно на актерах, общее состояние отсутствует (кроме почтового ящика), поэтому нет необходимости в STM. Но если эти субъекты также касаются общего состояния, им потребуется некоторая форма контроля параллелизма. Это подход, принятый в проекте Akka.

Крутая вещь в STM (в зависимости от реализации) заключается в том, что вы получаете постоянные структуры данных (постоянство не в смысле долговечности, а постоянное представление транзакций без вмешательства других транзакций) бесплатно. Multiverse, по сути, является реализацией Multi Version Concurrency Control (отсюда и название), и может случиться, что в любой момент времени несколько версий одного и того же объекта находятся в памяти.

Я думаю, что Clojure STM имеет много возможностей с Multiverse, поскольку обе основаны на схожих концепциях. Большая разница в том, что Clojure STM создан для Clojure и Multiverse для Java и других языков, основанных на JVM. И некоторые проблемы также решаются по-другому, например, блокирующие операции или устранение аномалий изоляции, таких как writekew.  проблема. Я ожидаю, что в будущем мы увидим больше опыления.

Люди разрабатывают реальные приложения с Multiverse? Пожалуйста, расскажите нам немного о сообществе  вокруг проэкт

На данный момент на Multiverse есть небольшой набор коммиттеров. Однако он используется в проекте Akka Джонаса Бонера, поэтому я продолжаю рассылать спам и по его списку рассылки. Выпуск 0.4 Multiverse — первый шаг к переходу от «крутого питомца» к продукту с открытым исходным кодом. Сайт был полностью заменен, написано большое руководство, и цель состоит в том, чтобы сделать больше шума, чтобы другие разработчики начали понимать, что параллельное программирование не должно быть таким сложным.

Вы делаете необычайно интересные вещи. Расскажите нам немного о вашем прошлом, пожалуйста.

Я нахожусь в бизнесе Java больше 10 лет, и я работал с различными компаниями под различными ролями. Начал работать в качестве разработчика, несколько лет занимался консультированием, где помогал клиентам со всеми видами проблем (производительность, параллелизм, базы данных), а 5 месяцев назад начал работать архитектором для стартапа, который создает среду распределенных приложений. , К сожалению, я не могу подробно рассказать об этом.

С самого начала мне нравились сложные, но объяснимые проблемы. Я начал с экспертных систем  и компиляторы Prolog (также написанные несколько), и 5 лет назад я начал сосредотачиваться на всем, что связано с параллелизмом: базы данных, нормальное управление параллелизмом, архитектура приложений, и с 18 месяцев я работаю над Multiverse.

Чего нам ожидать? Что станет следующей важной вехой для Multiverse?

Мультивселенная 0,5 ожидается через 10 недель и получит

  • больше транзакционных реализаций платформы Java-коллекций: TransactionalTreeMap, TransactionalTreeSet , TransactionalArray  и TransactionalArrayList

  • инструменты компиляции

  • аннотации, которые работают над методами интерфейсов; обычно они не наследуют, но я позабочусь об этом. Транзакционные настройки являются частью интерфейса, а не частью реализации.

  • много оптимизаций производительности в приборостроении

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

Долгосрочные цели:

  • обеспечить прозрачное постоянное решение. Поэтому нет необходимости иметь дело с настройкой базы данных, кэшированием или отображением, SQL-запросами и т. Д.

  • распределенные транзакционные объекты и распределенные транзакции. В данный момент я осматриваю терракоту и проверяю, подходит ли она. Идея состоит в том, что я собираюсь полностью обойти их оригинальные инструменты (поэтому не нужно иметь дело с bootclasspath) и подключить внутренние терракотовые API напрямую.

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

  • логический вывод оптимальные настройки для транзакций.

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

Где наши любопытные читатели могут найти больше информации о Multiverse?

Веб- сайт мультивселенной можно найти по адресу http://multiverse.codehaus.org.   

Список рассылки можно найти по адресу http://groups.google.com/group/ googlemultiverse. 

Но если у вас есть какие-либо вопросы о том, как использовать Multiverse или как Multiverse может быть интегрирован с вашим языком / платформой, вы всегда можете отправить мне электронное письмо прямо на alarmnummer на gmail dot com.  

P Eter, спасибо за  ваше  время и мы будем держать глаз на вашем действительно прохладном проекте