Size: a a a

Эликсир и Вунш

2018 August 26

DR

Dmitry Russ (Aleksandrov) in Эликсир и Вунш
Денис Квiтковий
Я практику прохожу и часть проекта, которую делаю я - на Elixir.
Так что я один в этом деле, ещё и нуб, с задачей сделать API-шку, разобраться что и как лучше😅
Раньше с Redis совсем дел не имел, поэтому подумал, что стоит спросить что куда и как😄
Это совет ментора, использовать Redis.
Сам подумал об ETS, но пока решил собрать все за и против :)
Ментор не знаком с Elixir/Erlang-ом? Обычно когда дело заходит о cache - в других языках говорят, возьми redis и всё. В мире beam, чтобы взять Redis - нужна либо действительно обоснованная причина (обычно одна из трёх перечисленных выше), так как крутые инструменты для cache-а уже встроенны в виде ETS (и библиотек поверх ETS, напирмер cachex).
источник

DR

Dmitry Russ (Aleksandrov) in Эликсир и Вунш
Ещё конечно можно взять Redis, просто чтобы научится использовать Redis, в данном случае, как четвёртая возможная причина 😊
источник

ДК

Денис Квiтковий in Эликсир и Вунш
Dmitry Russ (Aleksandrov)
Ментор не знаком с Elixir/Erlang-ом? Обычно когда дело заходит о cache - в других языках говорят, возьми redis и всё. В мире beam, чтобы взять Redis - нужна либо действительно обоснованная причина (обычно одна из трёх перечисленных выше), так как крутые инструменты для cache-а уже встроенны в виде ETS (и библиотек поверх ETS, напирмер cachex).
Скажем так - меня взяли из-за огромного любопытства в сторону Elixir.
Так что думаю, возможно в этом причина😅😄

Спасибо всем огромное☀️☀️☀️
источник

ДК

Денис Квiтковий in Эликсир и Вунш
Dmitry Russ (Aleksandrov)
Ещё конечно можно взять Redis, просто чтобы научится использовать Redis, в данном случае, как четвёртая возможная причина 😊
😄👍
источник

AD

Artem Denezhny in Эликсир и Вунш
источник

AD

Artem Denezhny in Эликсир и Вунш
хотите попробовать redis. redis-cli хватит с головай, тащить сюда elixir это лишнее
источник

ДК

Денис Квiтковий in Эликсир и Вунш
Artem Denezhny
хотите попробовать redis. redis-cli хватит с головай, тащить сюда elixir это лишнее
Там не только это нужно :)
Это лишь часть функционала, насчёт которого хотелось узнать все варианты.
В любом случае, спасибо за отзывчивость ☀️
источник

ДК

Денис Квiтковий in Эликсир и Вунш
Небольшой апдейт.
Согласно данной таблице, необходимы LRU Cache и PubSub.
источник

DR

Dmitry Russ (Aleksandrov) in Эликсир и Вунш
https://github.com/whitfin/cachex - LRU есть в cachex.
источник

DR

Dmitry Russ (Aleksandrov) in Эликсир и Вунш
Денис Квiтковий
Небольшой апдейт.
Согласно данной таблице, необходимы LRU Cache и PubSub.
В cachex есть LRU: https://github.com/whitfin/cachex/blob/master/docs/features/cache-limits.md#configuration PubSub не из коробки, но можно достаточно легко реализовать на основе hook-ов: https://github.com/whitfin/cachex/blob/master/docs/features/execution-hooks.md
источник

ДК

Денис Квiтковий in Эликсир и Вунш
источник

ML

Maksim Lapshin in Эликсир и Вунш
Денис Квiтковий
Использовать как cache для самых частых запросов, чтобы снизить нагрузку
1) использование кеша — это как антибиотики. Нельзя просто так начинать с них в профилактических целях, надо иметь серьезные причины что бы пихать кеш в проект.  У кеша есть проблема инвалидации кеша, а это проблема.

2) поход к редису — 1000 мкс, поход к ets — 1 мкс.
Оно тебе точно нужно по сети?
источник

ДК

Денис Квiтковий in Эликсир и Вунш
Maksim Lapshin
1) использование кеша — это как антибиотики. Нельзя просто так начинать с них в профилактических целях, надо иметь серьезные причины что бы пихать кеш в проект.  У кеша есть проблема инвалидации кеша, а это проблема.

2) поход к редису — 1000 мкс, поход к ets — 1 мкс.
Оно тебе точно нужно по сети?
Точно нужно: LRU, который есть в Cachex; PubSub, который таки можно реализовать, как выразились выше, с помощью hook'ов.
Так что, пока останавливаюсь над разбором с Cachex
источник

ML

Maksim Lapshin in Эликсир и Вунш
Денис Квiтковий
Точно нужно: LRU, который есть в Cachex; PubSub, который таки можно реализовать, как выразились выше, с помощью hook'ов.
Так что, пока останавливаюсь над разбором с Cachex
для начала подойдет, потом сможешь добраться до технологии асинхронного обновления с stale cache response
источник

ДК

Денис Квiтковий in Эликсир и Вунш
Maksim Lapshin
для начала подойдет, потом сможешь добраться до технологии асинхронного обновления с stale cache response
Признаюсь, для меня сейчас это звучит почти как заклинание. 🤓
Спасибо☀️
источник

ML

Maksim Lapshin in Эликсир и Вунш
Денис Квiтковий
Признаюсь, для меня сейчас это звучит почти как заклинание. 🤓
Спасибо☀️
что бы тебе нужен был кеш, надо что бы у тебя время на вычисление оригинального ответа было, скажем, 1 или 10 секунд
источник

ML

Maksim Lapshin in Эликсир и Вунш
если ты возьмешь примитивный LRU, то ты легко можешь получить такую ситуацию, что:
1) часто востребованный запрос очень надолго задержится в кеше, скажем зависнет на неделю и будет отдаваться что-то, очень старое и уже совсем не релевантное
2) очень большие и чрезвычайно запросы будут прилетать, блокировать всё-всё на своё вычисление и потом так же выбрасываться. При особо удачном сценарии, у тебя на _каждый_ запрос к очень трудновычислимому ресурсу, будет происходить заново пересчет, т.е. ты смотришь в кеш, там всё закешированно, а проку никакого, cache miss зашкаливает за 70%
источник

ML

Maksim Lapshin in Эликсир и Вунш
поэтому неплохо бы всё таки ставить таймаут на жизнь кешированного значения, а с ним возникает следующая проблема:  вот у тебя запросы все отдаются за микросекунды, а потом фигак и провал в тысячи раз
источник

ML

Maksim Lapshin in Эликсир и Вунш
что бы такого не было, ответ не стирается через таймаут, а удаляется и сигнализируется, что пора заново вытащить
источник

ML

Maksim Lapshin in Эликсир и Вунш
следующая дилема — это организация вычислений.

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

Если у тебя нет правильного лока, то запрос вычисляется 80 раз и кладется в кеш 80 раз.


Это фантастическое расточительство, нужно делать вменяемый лок на ресурс и сигнализировать, что сейчас есть какой-то процесс, который вычисляет ответ.

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

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