Я тестировал использование IBM Cloud Functions (управляемый Apache OpenWhisk) для запуска кода в фоновом режиме после завершения действия, но мой обратный вызов, предоставленный при вызове setTimeout
, не запускался в нужное время позже, и он никогда не запускался вообще, если я не вызвал функция во второй раз. Это было запущено в тот момент (поздно).
Подробности:
У меня было два варианта использования:
- Накопление данных нескольких запросов в памяти с последующим помещением большого объекта в корзину облачного хранилища объектов после того, как накопилось много данных или прошло определенное время без запросов.
- Управление подключением к базе данных для каждого контейнера для API, чтобы я мог закрыть подключение в неиспользуемом контейнере, который IBM Cloud Functions еще не уничтожил.
Я предполагал, что это сработает, потому что я использовал другие платформы, такие как Google Cloud Run, и заметил, что код работает в фоновом режиме (с использованием setTimeout и т. Д.), Просматривая журналы этого кода в Stackdriver после завершения запроса. И есть даже целая библиотека, созданная сторонником разработчика AWS, которая управляет подключениями MySQL в фоновом режиме на AWS Lambda (https://www.npmjs.com/package/serverless-mysql).
Я тестировал следующую функцию:
// from https://stackoverflow.com/questions/105034/how-to-create-guid-uuid
function uuidv4() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
function main() {
const runId = uuidv4().slice(31, 36);
console.log(`function started (runId = ${runId})`);
setTimeout(() => {
console.log(`after 5s delay (runId = ${runId})`);
}, 5000);
return {
msg: `ok (runId = ${runId})`,
};
}
И я развернул его командой ibmcloud fn action update logging-in-background src/index.js --kind nodejs:10
.
Я создал экземпляр LogDNA и установил его как экземпляр моей платформы, чтобы мои журналы функций переходили к нему. Вот что я вижу в журналах после трехкратного вызова функции с помощью команды ibmcloud fn action invoke logging-in-background --blocking
, каждые 10 секунд (CRN удален):
May 18 17:26:23 functions REDACTED 2020-05-18T21:26:23.956013Z stdout: function started (runId = 9be7c)
May 18 17:26:23 functions REDACTED Activation record '3589870e8ce44cc089870e8ce4acc018' for entity 'logging-in-background'
May 18 17:26:34 functions REDACTED 2020-05-18T21:26:34.111745Z stdout: after 5s delay (runId = 9be7c)
May 18 17:26:34 functions REDACTED 2020-05-18T21:26:34.115043Z stdout: function started (runId = faba6)
May 18 17:26:34 functions REDACTED Activation record 'ac47c067177648f187c0671776b8f1c2' for entity 'logging-in-background'
May 18 17:26:44 functions REDACTED 2020-05-18T21:26:44.248470Z stdout: after 5s delay (runId = faba6)
May 18 17:26:44 functions REDACTED 2020-05-18T21:26:44.253822Z stdout: function started (runId = 0af34)
May 18 17:26:44 functions REDACTED Activation record 'bbad3eabb3d64ab1ad3eabb3d61ab1a7' for entity 'logging-in-background'
Вы можете видеть, как, когда я впервые вызвал функцию, она записала только сообщение «функция запущена». Через 5 секунд не было зарегистрировано сообщение «после 5 секунд задержки». Но затем, в начале второго вызова, через 10 секунд после первого вызова, он, наконец, регистрирует сообщение «после 5-секундной задержки», связанное с запуском 9be7c. Обратный вызов для setTimeout
, похоже, никогда не будет запущен, как минимум, до следующего вызова действия.
Это то, как Apache OpenWhisk должен работать по задумке, или есть что-то, что я делаю неправильно, чтобы запускать код в фоновом режиме после завершения действия?