Иерархия порядков сообщений — различия между версиями
Yeputons (обсуждение | вклад) (Новая страница: «В распределённых системах могут быть разные гарантии порядка доставки отправленных соо…») |
м (rollbackEdits.php mass rollback) |
||
(не показано 8 промежуточных версий 2 участников) | |||
Строка 1: | Строка 1: | ||
+ | [[Категория: Параллельное программирование]] | ||
В распределённых системах могут быть разные гарантии порядка доставки отправленных сообщений. | В распределённых системах могут быть разные гарантии порядка доставки отправленных сообщений. | ||
Более того: иногда программисты могут неявно предполагать тот или иной порядок и очень удивляться, когда он нарушается. | Более того: иногда программисты могут неявно предполагать тот или иной порядок и очень удивляться, когда он нарушается. | ||
Строка 21: | Строка 22: | ||
[[Файл:distributed-order-fifo-wrong.png|400px]] | [[Файл:distributed-order-fifo-wrong.png|400px]] | ||
+ | |||
+ | Очевидно, что FIFO также гарантирует асинхронный порядок. | ||
== Причинно-согласованный порядок == | == Причинно-согласованный порядок == | ||
Строка 41: | Строка 44: | ||
Q -------b'---b-- | Q -------b'---b-- | ||
</pre> | </pre> | ||
+ | |||
+ | Причинно-согласованный порядок также гарантирует и FIFO-порядок, потому что из $a \le b$ следует $a \to b$. | ||
+ | |||
+ | == Синхронный порядок == | ||
+ | Можно считать, что сообщения доставляются мгновенно. | ||
+ | В сочетании с линейным порядком событий внутри процессов получаем | ||
+ | {{Определение | ||
+ | |definition= | ||
+ | В системе есть '''синхронный порядок''' сообщений, если всем сообщениям можно сопоставить время $T(m)$ (число) так, что верно: | ||
+ | * Для любого сообщения $m$: $T(rcv(m))=T(snd(m))$ (обозначается $T(m)$). | ||
+ | * Для любых двух событий $e \to f$ верно $T(e)<T(f)$ (обратное может быть неверно), т.е. $T$ является [[Логические часы Лампорта|логическими часами]]. | ||
+ | }} | ||
+ | Другими словами, можно рисовать стрелочки доставки сообщений строго вертикально. | ||
+ | |||
+ | Пример нарушения (причинно-согласованность не нарушена): | ||
+ | |||
+ | [[Файл:distributed-order-sync-wrong.png|400px]] | ||
+ | |||
+ | Синхронный порядок гарантирует причинно-согласованный порядок: от противного: пусть есть два сообщения $m, n$, причём $snd(m) \to snd(n)$ (тогда $T(m) < T(n)$) и $rcv(n) \to rcv(m)$ (тогда $T(n)<T(m)$), противоречие. |
Текущая версия на 19:40, 4 сентября 2022
В распределённых системах могут быть разные гарантии порядка доставки отправленных сообщений. Более того: иногда программисты могут неявно предполагать тот или иной порядок и очень удивляться, когда он нарушается.
Мы рассматриваем четыре гарантии порядка сообщений, от более слабых к более сильным:
- Асинхронная передачи: никаких гарантий, только exactly-once delivery
- FIFO (First In First Out order)
- Причинно-согласованный порядок (causally consistent ordering, от слова cause, а не casual)
- Синхронный порядок
Можно использовать различные алгоритмы, чтобы получить из более слабой гарантии более сильную.
При добавлении multicast/broadcast сообщений возникают свои проблемы, там нужно смотреть на общий порядок сообщений.
Содержание
FIFO
Не существует пары сообщений $m, n \in M$ таких, что $snd(m) < snd(n) \land rcv(n) < rcv(m)$ (тут $<$ работает только если два события произошли в одном процессе).
Переформулировка: для каждой упорядоченной пары процессов $(A, B)$ сообщения приходят к $B$ в том же порядке, в котором они отправлены $A$.
Пример нарушения:
Очевидно, что FIFO также гарантирует асинхронный порядок.
Причинно-согласованный порядок
Как FIFO, только вместо $<$ написали $\to$: не существует пары сообщений $m, n \in M$ таких, что $snd(m) \to snd(n) \land rcv(n) \to rcv(m)$.
Пример нарушения (пара сообщений $m=(a, b)$ и $n=(d, e)$):
Неверная переформулировка
На лекции не было, но может казаться правдоподобным.
Если есть события $a, a', b, b'$, причём $a<a'$, $proc(b)=proc(b')$ (взяли пару процессов и два события в каждом), $a\to b$ и $a' \to b'$ (взяли цепочки сообщений между ними), то $b < b'$ (порядок сообщений не меняется).
Проблема в том, что $a \to b$ может начаться не с сообщения, а с нескольких переходов внутри $proc(a)$:
P --a---a'--x---- \ \ Q -------b'---b--
Причинно-согласованный порядок также гарантирует и FIFO-порядок, потому что из $a \le b$ следует $a \to b$.
Синхронный порядок
Можно считать, что сообщения доставляются мгновенно. В сочетании с линейным порядком событий внутри процессов получаем
Определение: |
В системе есть синхронный порядок сообщений, если всем сообщениям можно сопоставить время $T(m)$ (число) так, что верно:
|
Другими словами, можно рисовать стрелочки доставки сообщений строго вертикально.
Пример нарушения (причинно-согласованность не нарушена):
Синхронный порядок гарантирует причинно-согласованный порядок: от противного: пусть есть два сообщения $m, n$, причём $snd(m) \to snd(n)$ (тогда $T(m) < T(n)$) и $rcv(n) \to rcv(m)$ (тогда $T(n)<T(m)$), противоречие.