Лямбды в сэндбоксе
Jan. 25th, 2017 09:47 pmВ начале декабря 2016 я писáл про песочницу для лямбд. Оно у нас взлетело на днях, и я нарадоваться не могу на удобство концепта.
В самом деле эта песочница – просто расширение концепта дизайн-документов в CouchDB. Один из первых кривых эскизов выглядел так:
Дизайн-документы в CouchDB – специальные документы, в которых хранятся не (не только) данные, а код, обычно map-reduce функций и фильтр-функций репликации. Каждый дизайн-документ исполняется в отдельном инстансе JS-энджина, то-есть в отдельном процессе.
Первый раз я этот концепт расширил, дополнив список функций раутером – он также хранится в дизайн-документах и тоже, как и map-reduce, js-функция. JS-rewrite (так это называется) теперь встроенная фича CouchDB 2.0. У меня JS-rewrite используется в бою, вот тут можно почитать, например.
Теперь мы этот концепт ещё расширили и дополнили всю эту кухню хуками.
Хуки как концепт – это упрощённая калька с Amazon Lambda. То-есть, по событиям обновления данных в БД выборочно запускаются функции, которые, в отличие от мап-редьюса и рерайта, могут быть асинхронными и могут произвольно читать из базы.
Писать в базу во время исполнения хуки не могут, список доков на сохранение – результат ресолва промиса хука. То-есть, документы пишутся в БД только когда хук завершился, а не во время его работы. Такой подход позволяет резко уменьшить вероятность рэйсов и inconsistency в данных.
Также хукам могут предоставляться (раздельно каждому через ключи в конфиге CouchDB) права на специальный функционал – отправку почты, СМС, возможность ходить в сеть и тп. Если исходный код или права доступа для хука меняются, хук принудительно перезапускается по-горячему.
В сущности, хуки совместно с потоком обновлений документов в БД образуют message queues, причём мессиджи – это просто обновлённые документы в БД.
Это всё, конечно, работает вне CouchDB, потому что тут без node.js никак – встроенный в CouchDB Spidermonkey бедноват для такой задачи. Тем не менее, оно плотно с CouchDB интегрировано и вокруг хуков воссоздаётся окружение очень близкое к нативной CouchDB.
Всё это писалось как неспециализированное решение, поэтому как закончим проект – заопенсорцим эту красоту.