Как работает CCR & amp; Сравнение модели инструментария DSS с другой масштабируемостью & amp; подходы к параллелизму?

StackOverflow https://stackoverflow.com/questions/815959

  •  03-07-2019
  •  | 
  •  

Вопрос

Мне интересно сравнение между различными подходами к масштабируемости & amp; параллелизм, включая CCR & amp; Модель каркаса DSS. Я был бы особенно заинтересован в сравнении с конкурентностью в стиле Hadoop и Erlang

Это было полезно?

Решение

Я посмотрел на CCR, DSS и Erlang, хотя из них я отправил только CCR в значительный производственный код. Я никогда не смотрел на Hadoop.

Параллельность Эрланга вытекает из его реализации модели актера. Каждый «процесс» имеет почтовый ящик и извлекает из него сообщения, по одному за раз. Процесс без сообщений для обработки блоков без потока. И наоборот, процессы, над которыми нужно работать, планируются на доступном процессоре, и ни один из базовых механизмов не отображается. Кроме того, процессы обмениваются сообщениями с помощью клонирования / неизменности, гарантируя, что P1 и P2 никогда не будут логически обмениваться сообщениями, которые передаются между ними.

Мне кажется, что неблокирующая природа отправки и получения сообщений дает Erlang репутацию масштабируемой на одной (возможно, многоядерной) машине. По сути, процессы, над которыми нужно работать, эффективно распределяются между доступными ресурсами, а процессы в состоянии покоя занимают только память. Обрабатывая по одному сообщению за раз, каждое из которых гарантирует стабильность сообщения, разработчику больше не нужно беспокоиться о таких вещах, как «условия гонки».

CCR - это набор низкоуровневых асинхронных примитивов передачи сообщений. Одним из более простых является прием, который получает а-ля Эрланг. Но есть и более сложные примитивы, такие как Join (получение сообщения по всем некоторым каналам) и Choice (получение сообщения по любому из некоторых каналов), которые могут быть вложенными и составленными интересными способами. Эти примитивы также неблокирующие. Получатели генерируют задачи (для обработки сообщений) в очереди задач 1..n, которые обслуживаются небольшим количеством потоков.

Я предполагаю, что, игнорируя (важно!) различия в платформах, основные подпрограммы планирования задач каждой из них находятся в основном в одном и том же парке. Тем не менее, Erlang - это язык и платформа с фиксированной (актерской) моделью. CCR не является ни одной из этих вещей, это всего лишь библиотека, и вы можете использовать / злоупотреблять ею более свободно.

DSS - это модель программирования, основанная на CCR. У него есть сервисы (Erlang = процессы), он предписывает асинхронную передачу сообщений (с полным клонированием по умолчанию) в качестве единственной формы межсервисной связи, и единственный дескриптор, который внешний сервис имеет для сервиса, - это его URI (Erlang = PID) , Как и в случае с Erlang, между вызовом локальной и удаленной службы, по сути, нет никакой разницы, хотя в последнем случае происходит (де) сериализация.

DSS также имеет модель RESTful, что означает, что сервисы обычно предоставляют фиксированный и общий набор операций, и что состояние сервиса должно рассматриваться как ресурс, управляемый этими операциями. Сравните это с Erlang, где произвольные сообщения могут быть отправлены процессу. Службы DSS могут использовать полный набор примитивов CCR при общении с другими службами, что может быть очень полезно для таких вещей, как распределенные операции сбора рассеяния.

В конечном счете, DSS - это просто инфраструктура с поддержкой библиотек, а не языка или виртуальной машины, поэтому в написании даже одной службы DSS значительно больше «церемоний», чем в написании процесса Erlang.

С точки зрения параллелизма, все предоставляют примитивы, необходимые для написания кода, который является безопасным и эффективным при нескольких потоках выполнения, не беспокоясь об этих потоках выполнения. Я думаю, что именно к этому стремится большинство разработчиков.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top