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