Download - Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

Transcript
Page 1: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

Использование  очередей  асинхронных  сообщений  с  

PostgreSQL

Илья  Космодемьянскийik@PostgreSQL-­‐ConsulLng.com

Page 2: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

Предпосылки

2

Page 3: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

синхронный  подход  vs  

асинхронный

• Писатель  пишет  сообщение  и  ждет  пока  читатель  подвердит  прочтение

• Писатель  не  ждет  читателя,  прочесть  сообщение  могут  когда  угодно

Page 4: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

Асинхронная  очередь

• Message

• Channel

• RouLng

• Filters

• Durability

4

Page 5: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

Асинхронная  очередь

• Удобно

• Быстро

• Позволяет  интегрировать  разнородные  системы

• Можно  построить  SOA

• Серебрянная  пуля

5

Page 6: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

Проще:  очередь  заданий

• В  чем  проблема:– Concurrency  

– Падения

6

Page 7: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

Проще:  очередь  заданий

• В  чем  проблема:– Concurrency  

– Падения

7

Решено  в  СУБД

Page 8: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

Проще:  очередь  заданий

• В  чем  проблема:– Concurrency  

– Падения

• При  стандартных  уровнях  изоляции  плохо,  при  жестких  -­‐  медленно.

• В  распределенном  случае  добавляются  “византийские”  конфликты

8

Page 9: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

“Реляционная  модель  плохо  масштабируется”

9

Народная  мудрость

Page 10: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

Что  именно  имели  ввиду?

• Целостность  данных  внутри  БД

• Внутри  отдельно  взятой  базы  ACID,  что  делать  в  случае  шардинга,  непонятно

10

Page 11: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

Распределенный  commit

• Предполагается,  что  все  участники  умеют  локальные  транзакции

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

• Coordinator  и  slave  (slaves)

• 1PC,  2PC,  PA,  PC,  3PC  (Skeen,  Stonebracker,  Gray,  Ozsu,  Mohan  ...)

11

Page 12: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

2PC

• Обеспечивает  распределенную  целостность

• Является  индустриальным  стандартом

12

Page 13: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

2PC

13

Figure 8.9 Two-phase commit protocol example.

331 [Rahimi, Haug]

Page 14: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

2PC

• Работает  если  все  в  порядке

• Для  аварийных  сценариев  нужно:–  2PC  TerminaLon  protocol

–  2PC  Recovery  protocol

• Падение  slave  (>=1)  -­‐  OK,  падение  coordinator  и  slave  -­‐  не  OK  [Skeen&Stonebraker]

• Высокий  оверхэд  на  обмен  сообщениями

14

Page 15: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

Что  такое  JMS

• Спецификация  высокого  уровня

• Реализации  (IBM  WebSphere  MQ,  Oracle  AQ,  Tibco  EMS,  Oracle  Open  ESB  etc.)

•  Чем  хорошо?– Спецификация  разумна

– Транзакционный  EJB

15

Page 16: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

Базы  и  очереди

• Oracle  +  Advanced  Q• IBM  DB2  +  IBM  WebSphere  MQ• PostgreSQL  +  PgQ?

16

Page 17: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

Для  PostgreSQL  нужны  очереди

• Postgres  нужно  масштабировать–  v.v.  <  9.2  → <  24х  ядер– fsync

– партиционирование

• Postgres  можно  масштабировать– не  нужно  платить  за  лицензию!

17

Page 18: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

PgQ

• Обвязка  на  Python

• Ticker  

• Event  log  table  и  снапшоты

18

Page 19: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

PgQ

• Обвязка  на  Python

• Ticker  

• Event  log  table  и  снапшоты

19

Идея:  средствами  SQL  в  PostgreSQL  очередь  сделать  нельзя!

Page 20: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

PgQ

• Обвязка  на  Python

• Ticker  

• Event  log  table  и  снапшоты

20

Кому  администрирование  Londiste  кажется  простым  и  логичным?;-­‐)

Page 21: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

mbus

• h�p://code.google.com/p/mbus/

• v  1.1  stable

• PostgreSQL  extension

• depends  on  hstore  only

21

Page 22: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

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

Page 23: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

mbus• hstore  headers

• hstore  payload

• paterns:– queue

– publish/subscribe

– request/responce

• selectors

• delivery  expiraLon/delivery  delay

23

Page 24: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

mbusqueue

24

mbus.create_queue(qname,  ncons)

Page 25: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

mbusqueue

25

mbus.create_queue(qname,  ncons)

consumers_cntКоличество  частей,  от  2х  до  128-­‐256Разумное  число  -­‐  сколько  консьюмеров  хотите  повесить  на  очередь,  слишком  много  -­‐  тяжелее  просмотреть  всю  очередь

Page 26: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

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  сообщения

Page 27: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

mbusqueue

27

mbus.consume(qname)Вычитывает  сообщение  из  очереди

Page 28: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

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);

Page 29: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

mbuspublish/subscribe

29

mbus.create_consumer(qname, cname, selector)

Page 30: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

mbuspublish/subscribe

30

mbus.create_consumer(qname, cname, selector)

Только  durable

Page 31: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

mbuspublish/subscribe

31

mbus.create_consumer(qname, cname, selector)

Статический  селектор  вида:$$(t.properxes-­‐>'STATE')='DONE'$$,  

Page 32: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

mbuspublish/subscribe

32

mbus.consume(qname, cname) mbus.consume_<qname>_by_<cname>()mbus.consumen_<qname>_by_<cname>(amt integer)

Page 33: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

mbussecurity

33

• mbus.control– superuser  =  true

– relocatable  =  false

– schema  =  'mbus'

• mbus.create_view(qname,  [cname,  vname])  

→  grant

Page 34: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

mbus  roadmap

• 2PC

• JMS-­‐клиент

34

Page 35: Илья Космодемьянский. Использование очередей асинхронных сообщений с PostgreSQL

• 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