Поддержка инфраструктуры Akka для поиска повторяющихся сообщений

Я пытаюсь построить высокопроизводительную распределенную систему с Akka и Scala.

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

Однако временное окно, в котором может быть запрошено дублирование вычислений, может быть сколь угодно малым. например Я мог получить тысячу или миллион сообщений, запрашивающих одни и те же дорогостоящие вычисления в один и тот же момент для всех практических целей.

Существует коммерческий продукт под названием Gigaspaces, который якобы справляется с этой ситуацией.

Однако, похоже, что в настоящий момент в Akka нет поддержки фреймворка для обработки повторяющихся рабочих запросов.Учитывая, что инфраструктура Akka уже имеет доступ ко всем сообщениям, маршрутизируемым через структуру, кажется, что решение для платформы может иметь здесь большой смысл.

Вот что я предлагаю для инфраструктуры Akka: 1. Создайте типаж, чтобы указать тип сообщений (скажем, "ExicingComputation" или что-то подобное), которые должны подлежать следующему подходу к кэшированию. 2. Интеллектуально (хеширование и т. Д.) Идентифицируйте идентичные сообщения, полученные (одними и теми же или разными) участниками в пределах настраиваемого пользователем временного окна. Другие варианты: выберите максимальный размер буфера памяти, который будет использоваться для этой цели, с учетом замены (например, LRU) и т. Д. Akka также может выбрать кэширование только результатов сообщений, обработка которых требует больших затрат; сообщения, обработка которых заняла очень мало времени, при необходимости могут быть повторно обработаны; не нужно тратить драгоценное буферное пространство на их кэширование и их результаты. 3. Когда идентифицируются идентичные сообщения (полученные в пределах этого временного окна, возможно, «в один и тот же момент времени»), избегайте ненужных повторяющихся вычислений. Платформа будет делать это автоматически, и, по сути, дублирующиеся сообщения никогда не будут получены новым субъектом для обработки; они будут молча исчезать, и результат однократной обработки (независимо от того, было ли это вычисление уже выполнено в прошлом или текущее прямо сейчас) будет отправлен всем соответствующим получателям (немедленно, если он уже доступен, и после завершения вычисления, если нет).Обратите внимание, что сообщения следует считать идентичными, даже если поля «ответа» различны, при условии, что семантика / вычисления, которые они представляют, идентичны во всех других отношениях. Также обратите внимание, что вычисления должны быть чисто функциональными, то есть без побочных эффектов, чтобы предлагаемая оптимизация кеширования работала и вообще не меняла семантику программы.

Если то, что я предлагаю, несовместимо с Akka, и / или если вы видите какие-то веские причины, почему это очень плохая идея, пожалуйста, дайте мне знать.

Спасибо, Отлично, Scala

5
задан scala_is_awesome 30 November 2011 в 23:18
поделиться