Форум сайта python.su
Задача: есть множество процессов на разных машинах, между которыми гуляют некоторые сообщениями через очередь с множественным доступом как на запись, так и на чтение. У всех их общая реляционная база данных. Предоставить другие средства для обмена в силу специфики задачи проблематично. Нужно обеспечить гарантированную безопасность при обмене сообщениями и чтоб при этом параллельность обработке не сводилась на нет. Видимые варианты решения:
1) Игры со степенью изоляции. Интересный вариант с аккадемической точки зрения, но я не готов его использовать в приложении где каждый сбой критичен.
2) Смена статуса + таймаут + оптимистичная автономная блокировка (последнее нужно на случай, если процесс по каким-то причинам не укладывается в отведённый заведомо большой таймаут). Всё замечательно с точки зрения гарантии ничего не потерять и изоляции. Но относительно сложно в реализации: легко где-нибудь ошибиться и сложно обеспечить полноценное тестирование.
Есть ещё какие-нибудь идеи?
P.S. Я знаю, что RDBMS не предназначены для использования в качестве очередей, но внешние условия такие.
Офлайн
Предоставить другие средства для обмена в силу специфики задачи проблематично.Это жесткое ограничение, или всё же возможны варианты? Например, rabbit-mq как сервер и amqplib как клиент?
Офлайн
Что имеется ввиду - под безопасностью?
Офлайн
j2aНе очень жёсткое, но:
Это жесткое ограничение, или всё же возможны варианты? Например, rabbit-mq как сервер и amqplib как клиент?
Или постановка звучит наиболее строго “есть сервер СУБД, более никаких серверов, есть py-клиенты, сделать py-клиентам очередь”.
Отредактировано (Дек. 14, 2007 10:23:42)
Офлайн
shizaПри любых непредвиденных обстоятельствах (вплоть до выхода сервера из строя) система должна вести себя так, как задумано.
Что имеется ввиду - под безопасностью?
Офлайн
Пока идей в голову не приходит.
odsНо этот вариант - на первый взгляд выглядит IMHO совсем не сложно (я сужу по самому простому варианту, так как конечно не знаю - какая нужна функциональность)
2) Смена статуса + таймаут + оптимистичная автономная блокировка (последнее нужно на случай, если процесс по каким-то причинам не укладывается в отведённый заведомо большой таймаут). Всё замечательно с точки зрения гарантии ничего не потерять и изоляции. Но относительно сложно в реализации: легко где-нибудь ошибиться и сложно обеспечить полноценное тестирование.
Офлайн
А если весь функционал на БД-шных процедурах сделать, то размазни не будет, и вообще красота =)
Отредактировано (Дек. 14, 2007 11:37:05)
Офлайн
shizaАвтономная блокировка - это длинная транзакция, что всегда плохо: нужно быть очень внимательным, чтобы не убить параллельность и не наделать dead-lock'ов.
Но этот вариант - на первый взгляд выглядит IMHO совсем не сложно (я сужу по самому простому варианту, так как конечно не знаю - какая нужна функциональность)
shizaАга, на нескольких машинках с time clash… Я бы назвал это нереальным. Создать test case на race condition не так просто. Я уж не говорю о том, чтобы такой test suite гонять после каждого изменения кода, всегда помня, что нет никакой гарантии, что он ошибку отловит.
Можно тестировать в лоб (не интрепрайз уровень конечно… но…) - сделать кучу рандомных клиентов с рандомными параметрами и гонять… гонять….
Офлайн
Ну… в составных системах (параллельных) - вообще невозможно все оттестировать в идеале. Больше думаешь и гоняешь - вероятность ошибок меньше =)
А над оптимистической автономной блокировкой. да… действительно надо подумать…
насколько глубокая проверка?
“если процесс по каким-то причинам не укладывается в отведённый заведомо большой таймаут” - можно немного распространить?
Отредактировано (Дек. 14, 2007 12:10:25)
Офлайн
shizaКонечно, можно засечь время обработки сообщения на хорошо загруженной системе и умножить его на 1000. Должно быть достаточно, но всякое бывает:
“если процесс по каким-то причинам не укладывается в отведённый заведомо большой таймаут” - можно немного распространить?
Офлайн