Одна компания с веселым названием «злые марсиане» и не менее веселым логотипом ведет свой канал в телеграмме.
Вот он: @evilmartians
Каждый второй пост там - как они прикрутили к ruby graphql.
Да, они пишут на ruby. В 2020. И, видимо, там есть большие проблемы с graphql :)
Но я не об этом. Последний их пост о том, как они мужественно в обход ActiveRecord (это класс из ORM Ruby On Rails, из-за которой когда-то в 2004 этот язык и приобрел хоть какой-то смысл) добавляют в базу триггеры для инкремента счетчиков в отдельной таблице postgresql при каждом INSERT/UPDATE вместо того, чтоб считать (внимание!) эти суммы в ElasticSearch.
После того, как ко мне вернулся дар речи, единственное, что я смог произнести: «Как тебе такое, Илон Маск»
Прочувствовать можно по ссылке:
https://evilmartians.com/chronicles/pulling-the-trigger-how-to-update-counter-caches-in-you-rails-app-without-active-record-callbacks
(судя по всему, раньше они это делали через колбеки в приложении :) )
Тут прекрасно все:
- и синтаксис ActiveRecord для создания таблиц
- и то как эти таблицы заполняются: User.insert_all(10_000.times.map { { created_at: Time.now, updated_at: Time.now } })
- и запуск EXPLAIN из кода
- и, конечно, царь горы - триггер. На каждый insert и update делается upsert в сводную таблицу на основании выборки count и sum. Upsert в postgres делается на синтаксисе on conflict update, и так себе работает при параллельных запусках (расскажу об этом при случае). Чтобы победить race condition, мужественные марсиане решают провернуть уличную магию с рекомендательными блокировками (не делайте так никогда, во имя святого Стоунбрейкера).
С триггерами в рельсах, кстати, какие-то проблемы и предлагается использовать специальный форк отдельного пакета (!!!) для триггеров от автора статьи.
And one more thing...
Эти ребята приложили руку к @rocketbank.
Похоже, тинькофф что-то знал, когда буллил ракетчиков :)))
PS: На одной из конференций встретил двух знакомых, пишущих на ruby. Они, еле находя время на вздох, хором ржали над людьми, пишущими на серверном js...
Post #10
228