Докладчик: ...я...
Что такое zookeeper?
Что такое мьютекс?
Что такое сервер?
Apache Zookeeper: система для синхронизации работы распределенных приложений .
Apache Zookeeper: система для синхронизации работы распределенных приложений .
Apache Zookeeper: система для синхронизации работы распределенных приложений .
Zookeeper
Server Side:
/
|-node1
|-node2
|---subnode1
|---subnode2
|-node3
|---subnode
|-----subsubnode
|-zookeeper
Server Side:
/
|-node1
|-node2
|---subnode1
|---subnode2
|-node3
|---subnode
|-----subsubnode
|-zookeeper
Operations
Garantees
Garantees
Garantees
Garantees
Garantees
Garantees
Сделать стабильный сервис, доступный 24/7
Сделать стабильный сервис, доступный 24/7
Сделать стабильный сервис, доступный 24/7
Сделать стабильный сервис, доступный 24/7
Сделать стабильный сервис, доступный 24/7
Сделать стабильный сервис, доступный 24/7
Сделать стабильный сервис, доступный 24/7
Создадим нод. Если удалось - лок взят.
Если неудалось - ждем случайный промежуток времени и пробуем снова.
Удаление нода - освобождение лока
Коллбеки можно повесить при операциях чтения
(getData, getChildren, exists)
Коллбеки можно повесить при операциях чтения
(getData, getChildren, exists)
Create | Delete | Change | Child | |
---|---|---|---|---|
exists | ||||
getData | ||||
getChildren |
Одноразовый вызов при:
Watchers ordering guarantee:
Клиент никогда не увидит измененные данные прежде, чем ему придет уведомление об изменении данных
Create | Delete | Change | Child | |
---|---|---|---|---|
exists | ||||
getData | ||||
getChildren |
Одноразовый вызов при:
String res = zk.create("/path/to/node/prefix-" // Node path
, new byte[16] // Node data
, Ids.OPEN_ACL_UNSAFE // Authorization
, CreateMode.EPHEMERAL_SEQUENTIAL // Mode
);
String res = zk.create("/path/to/node/prefix-" // Node path
, new byte[16] // Node data
, Ids.OPEN_ACL_UNSAFE // Authorization
, CreateMode.EPHEMERAL_SEQUENTIAL // Mode
);
res; // "/path/to/node/prefix-0000000001"
Node
prefix-001
prefix-002
Node
prefix-001
prefix-002
prefix-003
Node
001
002
003
Действия после создания нового потомка
Действия после создания нового потомка
Действия после создания нового потомка
Действия после создания нового потомка
001
002
003
Действия после создания нового потомка
Не нашел нормального способа продемонстрировать herd effect.
Пропал Ребенок
В имени потомка должен содержаться уникальный идентификатор
В имени потомка должен содержаться уникальный идентификатор
В имени потомка должен содержаться уникальный идентификатор
Не нашел как стабильно воспроизвести ошибку с возвратом имени на сервере.
На кой черт так мучаться? Гуглим Делаем любую реализацию lockByName и вешаем на простейший веб-сервис.
public class KeyedReentrantLock<K> {
private ConcurrentMap<K, ReentrantLock> lockMap = new ConcurrentHashMap<K, ReentrantLock>();
public void lock(K key) {
ReentrantLock oldLock = lockMap.get(key);
if (oldLock != null && oldLock.isHeldByCurrentThread()){
// increase lock count and return.
oldLock.lock();
return;
}
ReentrantLock newLock = new ReentrantLock();
newLock.lock();
while ((oldLock = lockMap.putIfAbsent(key, newLock)) != null){
// wait for the old lock to be released;
oldLock.lock();
oldLock.unlock();
}
return;
}
public void unlock(K key){
ReentrantLock lock = lockMap.get(key);
if (lock == null) throw new IllegalMonitorStateException("There was no lock for this key!");
if (lock.getHoldCount() == 1){
lockMap.remove(key);
}
lock.unlock();
}
}
На кой черт так мучаться? Гуглим Делаем любую реализацию lockByName и вешаем на простейший веб-сервис.
На кой черт так мучаться? Гуглим Делаем любую реализацию lockByName и вешаем на простейший веб-сервис.
На кой черт так мучаться? Гуглим Делаем любую реализацию lockByName и вешаем на простейший веб-сервис.
На кой черт так мучаться? Гуглим Делаем любую реализацию lockByName и вешаем на простейший веб-сервис.
На кой черт так мучаться? Гуглим Делаем любую реализацию lockByName и вешаем на простейший веб-сервис.
На кой черт так мучаться? Гуглим Делаем любую реализацию lockByName и вешаем на простейший веб-сервис.
Интерактивное....
Если этот способ лока такой "стандартный", почему никто не написал сразу лок?
Если этот способ лока такой "стандартный", почему никто не написал сразу лок?
$ ls ./zookeeper/recipes/lock/src/java/org/apache/zookeeper/recipes/lock
LockListener.java ProtocolSupport.java WriteLock.java ZNodeName.java ZooKeeperOperation.java
$ ls ./zookeeper/recipes/
election lock queue
] get /javann_demo_three
cZxid = 0x2
ctime = Mon Jan 25 15:58:01 MSK 2016
mZxid = 0x2
mtime = Mon Jan 25 15:58:01 MSK 2016
pZxid = 0x500000002
cversion = 80
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 16
numChildren = 0
Куча дополнительной инфы о ноде
Кастомная настройка серверов...
Кастомная настройка серверов...
ACL: настройки доступа "из коробки"
Кастомная настройка серверов...
ACL: настройки доступа "из коробки"
Качественная система логирования
групповые выборы
(иерархические сервера)