☁️

LINE Botの開発でCloudflareとHonoを使う理由

2024/06/08に公開

概要

速さが正義

LINE Botの開発でCloudflareとHonoを使う理由

Cloudflare Workersの応答速度が速いから

PoPについて

CloudflareはAWSのlambdaに比べてポイントオブプレゼンス(PoP)の数が多く、処理が実行される場所がよりユーザーの近くにある可能性が高い。

そのため、パフォーマンステストではAWS Lambda、AWS Lambda@Edgeよりも応答時間が小さいという結果になった。
https://www.cloudflare.com/ja-jp/learning/serverless/serverless-performance

コールドスタートがない

Cloudflare Workersはコールドスタートがなく、LambdaとLambda@EdgeのようにEventBridgeで1分おきにツンツンしなくていい。

https://aws.amazon.com/jp/blogs/news/operating-lambda-performance-optimization-part-1

Service bindingsが便利だから

Cloudflare WorkersのService bindingsを使用することで、worker間の通信はパブリックにアクセス可能なURLを経由せずに実行されるため、レイテンシーが発生しない。

https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings/

そして、1つのworkerの責務を小さくして、それらを連携するようなアーキテクチャで作ることによって関心の分離が簡単に実現できる。これにより並行で複数Workerの実装ができるため開発効率も向上する。

また、Service bindingsのインターフェースとして、HTTPというタイプとRPCというタイプがあり、RPCというタイプを使用することで、別のworkerをJavaScriptの関数のように使用することができる。

// Service bindingsで使用するためのworkerを作成

import { WorkerEntrypoint } from "cloudflare:workers";

export class WorkerB extends WorkerEntrypoint {
  async add(a, b) { return a + b; }
}
// RPC型で実装されたworkerを使用

export default {
  async fetch(request, env) {
    const result = await env.WORKER_B.add(1, 2);
    return new Response(result);
  }
}

https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings/

基本的にRPCが推奨されており、自分はVercelなどでホスティングされているNext.jsアプリケーションのようなCloudflare Workers以外からworkerを実行したい時のみHTTPのタイプを使用している。

(おまけ)Hono勉強しとけば色々使えるしキャッチアップが楽

Honoを勉強しとけば色々使えます。そしてキャッチアップも楽です。
Honoは以下のコードだけで動きます。そしてデプロイもnpm run deploy コマンドを実行するだけでOK。

import { Hono } from 'hono'

const app = new Hono()

app.get('/hello', (c) => {
  return c.json({
    message: `Hello!`,
  })
})

また最近では、自然言語を用いてReactコンポーネントを作成できるv0.devというサービスにインスパイアされた、自然言語でAPIを実装し、そのままCloudflare Workersにデプロイ可能なHanabi.restというサービスがリリースされ話題になっています。このHanabi.restで生成されるコードはHonoをベースとして作成されており、Honoを使用した開発効率を劇的に向上させたと言える。(まだ使ったことはない)
https://v0.dev/

https://hanabi.rest/

また、HonoというのはRPC(Service bindingsとは別)の機能を簡単に使用することができ、json()という形式でレスポンスを返しているエンドポイントの返り値の型を参照したり、エンドポイントのURLを呼び出すことができる。

また、HonoはNext.jsのルートハンドラーでも使用することができ、Honoを使用することで、Next.js内部のAPIのエントリーポイントを1つにすることができます。この特性により、Next.jsとHonoを組みわせた開発を行うことで、開発効率が向上する。

https://zenn.dev/sh1n4ps/articles/8cde3be74de0ec

このように、Honoはいろんな場所で活用することができるので、使えるようになると開発効率が上がる。

まとめ

というような理由で、私はLINE Botの開発でCloudflareとHonoを使用しています。←まあこれは後付けの理由で、なんか面白そうだから使ってみたら思ってたよりも相性が良かったから使い続けてます。

キャッチアップにおすすめ

複数workerを組み合わせた開発でのディレクトリ構成の参考になります。
https://github.com/yusukebe/js-rpc-examples

これを一通り読むと大体なんでもできます。
https://hono.dev/

ついでにこれも一通り目を通すと良いです。
https://github.com/honojs/examples

これも一通り読むと大体なんでもできます。
https://developers.cloudflare.com/workers/

shinaps テックブログ

Discussion