распределенные транзакции и очереди, ruby, erlang, scala - PullRequest
5 голосов
/ 13 октября 2011

У меня проблема с несколькими компьютерами, очередями сообщений и транзакциями.Так, например, пользователь нажимает на веб-страницу, щелчок отправляет сообщение на другой компьютер, который добавляет платеж в учетную запись пользователя.Там может быть много тысяч кликов в секунду.Все аспекты транзакции должны быть отказоустойчивыми.

Раньше мне никогда не приходилось сталкиваться с чем-то подобным, но после небольшого прочтения это хорошо известная проблема.

мои вопросы.Правильно ли я полагаю, что безопасный способ сделать это с двухфазной фиксацией, но протокол блокирует, и поэтому я не получу требуемую производительность?Я обычно пишу на Ruby, но кажется, что БД, такие как redis и система очередей сообщений, такие как Rescue, RabbitMQ и т. Д., Не очень мне помогают - даже если я реализую какую-то двухфазную фиксацию, данные будут потеряны, если redis завершится сбоем, потому чтопо сути, это только память.

Все это заставило меня взглянуть на эрланг и скалу - но прежде чем я зайду и начну изучать новый язык, я действительно хотел бы лучше понять, стоит ли это тогоусилия.В частности, правильно ли я считаю, что из-за своих возможностей параллельной обработки эти языки являются лучшим выбором для реализации протокола блокировки, такого как двухфазное принятие, или я запутался?И если да, есть ли причина выбирать одну, а не другую (особенно в этом контексте - я знаю, что есть много тем и блогов, сравнивающих эти два в более общем смысле)

Извинения за перекрестную публикацию - это было первымопубликовал в стек-обмене, но я добавил к вопросу, и эта версия, вероятно, лучше подходит здесь

1 Ответ

9 голосов
/ 13 октября 2011

1) Двухфазная фиксация не отказоустойчива - см. Ссылку. Вам потребуется либо общая трансляция порядка , либо неблокирующая атомарная фиксация, в зависимости от точной постановки проблемы, которую вы решаете.

2) Я бы не сказал, что Scala гораздо более подходит, чем большинство других языков общего назначения для реализации двухфазной фиксации. В частности, STM , параллельные и распределенные коллекции вам здесь не помогут. Акторы Scala и удаленные актеры могут предоставить вам хороший API для асинхронной отправки сообщений (на одной и той же машине или удаленно), но по умолчанию они не дают абстракций, таких как различные детекторы сбоев, которые были бы полезны например, для реализации трансляций общего порядка - вам все равно придется их реализовать самостоятельно (с другой стороны, я считаю, Akka имеет эти абстракции).

3) Я не могу говорить за Эрланга и Руби, но что касается Scala и Java, вы можете рассмотреть вопрос о Akka . Он основан на модели распределенного актора, которая также поддерживает транзакции и различные уровни отказоустойчивости. Вероятно, лучше использовать их инфраструктуру, чем писать собственную распределенную отказоустойчивую среду выполнения с нуля.

...