Upload
ontico
View
1.133
Download
5
Embed Size (px)
DESCRIPTION
Citation preview
Использование очередей асинхронных сообщений с
PostgreSQL
Илья Космодемьянскийik@PostgreSQL-‐ConsulLng.com
Предпосылки
2
синхронный подход vs
асинхронный
• Писатель пишет сообщение и ждет пока читатель подвердит прочтение
• Писатель не ждет читателя, прочесть сообщение могут когда угодно
Асинхронная очередь
• Message
• Channel
• RouLng
• Filters
• Durability
4
Асинхронная очередь
• Удобно
• Быстро
• Позволяет интегрировать разнородные системы
• Можно построить SOA
• Серебрянная пуля
5
Проще: очередь заданий
• В чем проблема:– Concurrency
– Падения
6
Проще: очередь заданий
• В чем проблема:– Concurrency
– Падения
7
Решено в СУБД
Проще: очередь заданий
• В чем проблема:– Concurrency
– Падения
• При стандартных уровнях изоляции плохо, при жестких -‐ медленно.
• В распределенном случае добавляются “византийские” конфликты
8
“Реляционная модель плохо масштабируется”
9
Народная мудрость
Что именно имели ввиду?
• Целостность данных внутри БД
• Внутри отдельно взятой базы ACID, что делать в случае шардинга, непонятно
10
Распределенный commit
• Предполагается, что все участники умеют локальные транзакции
• Протокол занимается организацией распределенного взаимодействия
• Coordinator и slave (slaves)
• 1PC, 2PC, PA, PC, 3PC (Skeen, Stonebracker, Gray, Ozsu, Mohan ...)
11
2PC
• Обеспечивает распределенную целостность
• Является индустриальным стандартом
12
2PC
13
Figure 8.9 Two-phase commit protocol example.
331 [Rahimi, Haug]
2PC
• Работает если все в порядке
• Для аварийных сценариев нужно:– 2PC TerminaLon protocol
– 2PC Recovery protocol
• Падение slave (>=1) -‐ OK, падение coordinator и slave -‐ не OK [Skeen&Stonebraker]
• Высокий оверхэд на обмен сообщениями
14
Что такое JMS
• Спецификация высокого уровня
• Реализации (IBM WebSphere MQ, Oracle AQ, Tibco EMS, Oracle Open ESB etc.)
• Чем хорошо?– Спецификация разумна
– Транзакционный EJB
15
Базы и очереди
• Oracle + Advanced Q• IBM DB2 + IBM WebSphere MQ• PostgreSQL + PgQ?
16
Для PostgreSQL нужны очереди
• Postgres нужно масштабировать– v.v. < 9.2 → < 24х ядер– fsync
– партиционирование
• Postgres можно масштабировать– не нужно платить за лицензию!
17
PgQ
• Обвязка на Python
• Ticker
• Event log table и снапшоты
18
PgQ
• Обвязка на Python
• Ticker
• Event log table и снапшоты
19
Идея: средствами SQL в PostgreSQL очередь сделать нельзя!
PgQ
• Обвязка на Python
• Ticker
• Event log table и снапшоты
20
Кому администрирование Londiste кажется простым и логичным?;-‐)
mbus
• h�p://code.google.com/p/mbus/
• v 1.1 stable
• PostgreSQL extension
• depends on hstore only
21
mbus
22
=# create extension hstore;=# create extension mbus;
v1.1 by default, Postgres 9.2
=# create extension mbus version 1.0;
specify version for Postgres 9.1 or 9.0
mbus• hstore headers
• hstore payload
• paterns:– queue
– publish/subscribe
– request/responce
• selectors
• delivery expiraLon/delivery delay
23
mbusqueue
24
mbus.create_queue(qname, ncons)
mbusqueue
25
mbus.create_queue(qname, ncons)
consumers_cntКоличество частей, от 2х до 128-‐256Разумное число -‐ сколько консьюмеров хотите повесить на очередь, слишком много -‐ тяжелее просмотреть всю очередь
mbusqueue
26
mbus.post_<qname>(data hstore, headers hstore DEFAULT NULL::hstore, properties hstore DEFAULT NULL::hstore, delayed_until timestamp DEFAULT NULL,expires timestamp DEFAULT NULL)
Возвращает iid сообщения
mbusqueue
27
mbus.consume(qname)Вычитывает сообщение из очереди
mbusqueue
28
mbus.consume(qname)Resultset вида:CREATE TABLE qt_model ( id integer NOT NULL, added timestamp without time zone NOT NULL, iid text NOT NULL, delayed_until timestamp without time zone NOT NULL, expires timestamp without time zone, received integer[], headers hstore, properties hstore, data hstore);
mbuspublish/subscribe
29
mbus.create_consumer(qname, cname, selector)
mbuspublish/subscribe
30
mbus.create_consumer(qname, cname, selector)
Только durable
mbuspublish/subscribe
31
mbus.create_consumer(qname, cname, selector)
Статический селектор вида:$$(t.properxes-‐>'STATE')='DONE'$$,
mbuspublish/subscribe
32
mbus.consume(qname, cname) mbus.consume_<qname>_by_<cname>()mbus.consumen_<qname>_by_<cname>(amt integer)
mbussecurity
33
• mbus.control– superuser = true
– relocatable = false
– schema = 'mbus'
• mbus.create_view(qname, [cname, vname])
→ grant
mbus roadmap
• 2PC
• JMS-‐клиент
34
• Gerhard Weikum, Gottfried Vossen - Transactional Information Systems: Theory, Algorithms, and the Practice of Concurrency Control and Recovery
• Saeed K. Rahimi, Frank S. Haug - Distributed Database Management Systems: A Practical Approach
• Gregor Hohpe, Bobby Wolf - Enterprise Integration Patterns
35