この記事は何
最近RubyでCloud Functionsを書くときに、レスポンスだけ先に返して処理を続ける必要があったので、その方法を紹介する記事です。
Cloud Functionsで開発していた時の課題
Cloud Functionsを使ってSlackでスラッシュコマンドを用いたボットの開発を行っていたのですが、開発するにあたり、以下のような問題が発生していました。
- スラッシュコマンドは3秒以内にレスポンスを返さないとエラーになる
- スラッシュコマンドがエラーになってもCloud Functions上で処理を続けることはできるが、その場合スラッシュコマンドで入力した文章を他のメンバーに共有できない
-
https://qiita.com/memomaruRey/items/82f7ea73cb3cfb856925 にある通り、
in_channel
というresponse_typeをレスポンスで返さないと共有できない
-
https://qiita.com/memomaruRey/items/82f7ea73cb3cfb856925 にある通り、
これらの問題を解決する方法としては https://qiita.com/saken649/items/b70e462ae41614b72f77
のように
- レスポンスを先に返す
- 「Running...」のようなレスポンスだけ先に返す
- 自在の処理はレスポンスを返した後に続ける
- 処理が終わったタイミングで、SlackのAPIを用いて結果をポストする
というような処理を行う方法が一番シンプルです。
Rubyでの実現方法
https://qiita.com/saken649/items/b70e462ae41614b72f77 はNode.jsで実装されていますが、
Rubyでも同じようなことができないか調べてみました。
結論から言うと、Thread
を用いることで実現ができます。
以下のようなコードを書くことで、先にレスポンスを返し、処理を続けることができました。
require 'functions_framework'
FunctionsFramework.http 'function' do |request|
Thread.new do
very_long_transaction
'OK'
end
'Running...'
end