Dùng thử Google Cloud Functions làm Slack App

Ngắn gọn là: không dùng được vì… quá chậm.

Dùng thử Google Cloud Functions để viết một cái app đặt đồ ăn trên Slack (để mọi người dùng trên công ty). Ý tưởng khá là dễ: cái app này chỉ là trung gian nhận webhook và gửi request giữa Slack và một service khác bên ngoài (AirTable), vì vậy không cần phải thuê hẳn một cái server túc trực 24/24, trong khi đó Google Cloud Functions cho một gói free tier khá hào phóng: 2 triệu request / tháng, tha hồ dùng, đảm bảo đặt đồ ăn cả tháng cũng không thể nào vượt quá 2 triệu request được.

Thế nhưng có vấn đề thế này. Sau khi hoàn thành hết mọi công đoạn development, quyết định deploy lên Google Cloud để test thử thì thấy có một hiện tượng rất lạ: response quá chậm.

Logic của app khá đơn giản:

  1. Nhận một request từ web hook của Slack
  2. Gửi một request đến AirTable, nhận response
  3. Gửi lại một request đến Slack

Tổng thời gian chạy trên Google Cloud mất gần 5 giây?! Server ở US, RAM 256MB, không lý nào lại chậm như vậy.

Trong Slack nó có một giới hạn 3 giây — là khoảng thời gian để trả lời request, nếu không thì Slack command sẽ fail và hiện lỗi timeout. Với độ latency 5 giây của Google Cloud thì không có cách gì sử dụng app này được.

Bên dưới là sử dụng Postman để gửi request đến Google Cloud Functions, request đơn giản, nhận về 1 đoạn text.

2.8 giây, quá nhiều!

Thử gửi lại vài lần thì response time giao động không ổn định từ 300ms đến 4000ms, tùy lúc. Trong khi đó, deploy app này lên now.sh thì request ổn định hơn rất nhiều:

Sau một hồi tìm hiểu, được biết lý do mà Cloud Functions lúc nhanh lúc chậm là do cold start: sau một khoảng thời gian không sử dụng thì container của chúng ta sẽ bị “đóng băng” lại, request đầu tiên nhận được sau đó sẽ khởi động lại container và sẽ tốn thời gian hơn bình thường. Một số link đọc (trong link có người còn bị latency đến hơn 10 giây):

Mặc dù vậy, độ latency của Google Functions vẫn rất bất thường. Sau khi thử gửi 5 request liên tiếp nhau bằng Postman lên một funciton, đây là kết quả response time trả về lần lượt.

  • 4128ms (cold start)
  • 326ms
  • 392ms
  • 3731ms (?!)
  • 289ms
  • 2502ms (?!)
  • 261ms
  • 293ms
  • 634ms
  • 272ms

Có 3/10 request mấ hơn 3 giây để response, rất không ổn định. Và nếu một cái Slack app mà bạn gõ command vào có 90% bị timeout trong lần đầu và 30% timeout trong những lần tiếp theo, thì sẽ chẳng có ai sử dụng.

Nói chung: không dùng Google Cloud Functions để build Slack app được.

Vấn đề latency này Google đã biết và đang cố gắng giải quyết, chúng ta developer thì không thể làm được gì nhiều ngoài việc report issue và ngồi chờ. Google Cloud Functions vẫn còn rất nhiều thứ chưa hoàn tất tại thời điểm viết bài này: environment variable, custom domain name, hỗ trợ các ngôn ngữ khác ngoài JS trên node 6, v…v…

Sẽ quay lại thử nghiệm Google Cloud Functions sau một thời gian nữa. Ngoài ra cũng sẽ xem xét dùng thử Lamda của AWS.

— —

Sau khi xem xét và thí nghiệm kỹ càng hơn, có một phát hiện là dịch vụ now.sh cũng có “cold start”, tuy nhiên các request sau “cold start” thì ổn định hơn rất nhiều. Request cold start tốn trung bình 5000ms, các request sau ổn định ở mức 400ms, tuyệt vời hơn nữa là có thể disable tính năng cold start này đi để cho service luôn luôn chạy. Đã quyết định dùng now.sh để host service và sẽ consider mua plan On Demand nếu giá cả hợp lý.

Like what you read? Give Tony Dinh a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.