🍃このブログは移転しました。
3秒後、自動的に移動します・・・。

CloudflareのDeveloper Week 2023の気になった発表のまとめ

今年も祭りの季節がやってきましたね。

Developer Week 2023 | Cloudflare

というわけで、今年も個人的に気になったものを。

(発表されるのがだいたいJST深夜かつ最後が金曜日なので、どうやっても公開するの週明けになるんよな・・)

Introducing Constellation, bringing AI to the Cloudflare stack

https://blog.cloudflare.com/introducing-constellation/

  • Workersで機械学習のモデルが動かせるようになったとのこと
    • プライベートβ
  • サポートされているランタイムで動作するモデルであれば、自作のものでも、用意されてるものでもOK
  • 現状はONNX形式のみ対応
  • プライベートβでは、モデルのサイズは10MiBまで
    • ちっさくない?
  • 用意されてるモデルは、`wrangler constellation catalog list`でみれる
    • そのアカウントでConstellationが有効可されてる必要あり
  • コードとしては薄いラッパーを介して使う

ML界隈に詳しくないのでこれが実用的なのかはよくわからないけど、敷居が下がってくる分にはうれしい。

Introducing Cursor: the Cloudflare AI Assistant

https://blog.cloudflare.com/introducing-cursor-the-ai-assistant-for-docs/

  • CloudflareのDocsについて教えてくれるAIアシスタントができたよ
  • どういう構成か
    • Workers, Durable Objects, OpenAI, Cloudflare developer docs
    • OpenAIのドキュメントにもあるSearch-Askメソッドというパターン
    • EmbeddingsとCompletionを併用するアレ

最近はこういうAIアシスタントがたけのこのように生まれとるね。

Smart Placement speeds up applications by moving code close to your backend — no config needed

https://blog.cloudflare.com/announcing-workers-smart-placement/

  • Workerのロケーションを最適化してくれる機能
  • たとえば
    • ユーザーが日本からアクセスすると、Workerは日本のエッジにアクセスする(近いし、そもそもそれがエッジWorker)
    • ただ、そこから北米にあるDBサーバーにアクセスしてたとしたら?
    • もしそれが1RTですまず、複数回のアクセスだったとしたら?
    • この場合、Worker自体もDBのある北米に移してしまうほうが、パフォーマンスが向上するというわけ
  • 簡易的なAAで`-`をネットワーキングと表現するならば、
    • 日本 - 日本 === 北米: =のところが遅い
    • 日本 --- 北米 = 北米: =のところが速いので結果的に速い
  • というのを体感できるデモ
  • そもそもエッジとしては、ユーザーに近いところでサクッと実行される想定だった
    • が、ユースケースが拡大するにつれ、やはりデータベースありきだと気づいた
    • なのでリージョンを指定できないことが逆に問題になるケースもあった
  • もちろんKV,DO, D1みたいなCloudflareスタックであれば、その心配はもともとないけど
  • 機能を有効にするには、Workerごとにフラグを1つ立てるだけ
    • Dashboardからでも、`wrangler.toml`からでも
    • ロケーションは自動的に賢く選んでもらえる
      • 移転しないほうがパフォーマンスがよければ、移転しない
      • そもそも1RTしかしてないなら、移転しない、などなど
  • https://developers.cloudflare.com/workers/platform/smart-placement/

これは普通に嬉しいやつ。
DBがアメリカにあるなら、日本のエッジでリクエスト受けても嬉しいことあんまないのでは?ってずっと思ってたので。

ただService bindingsとの使い分けとか、そのへんは気になるところ。自動でお手軽にやりたいならって感じ?

Announcing connect() — a new API for creating TCP sockets from Cloudflare Workers

https://blog.cloudflare.com/workers-tcp-socket-api-connect-databases/

  • WorkerからOutboundのTCPが話せるようになった
  • `connect()`のAPIについては、いろいろな経緯でこうなった
    • 既存の実装もいろいろあって、どれかに合わせるべきかとか
    • 最終的にはオリジナルになったけど、WinterCGにフィードバックしていく予定
  • このタイミングでは、PostgresDBがサポート済
  • 次はMySQLのサポートを進めているところ
  • 現状の課題として、1リクエストごとに、1コネクションを開いて閉じる必要があることは認識してる
    • コネクションプーリングに代わる仕組みを検討中
  • さらに今後
  • ↑で紹介したSmart Placementにも対応予定

なんでもできるようになるな・・・!

Improved local development with wrangler and workerd

https://blog.cloudflare.com/wrangler3/

  • `wrangler` CLIがついにv3に
  • `workerd`を使ってローカルで開発できるようになった
    • つまり本番とまったく同じランタイムってこと
  • そして今度こそ、ローカルがデフォルトの挙動に
  • 内部的にはちょっと大変だった
  • Miniflareのv2で実装されたユニットテストの環境も
    • すべてがNode上にあった頃は、ランタイムAPIをモックするだけでよかった
    • しかし`workerd`は別プロセスになるので、簡単にはいかない
    • Nodeの`worker_threads`を使うように、`workerd`をスレッドとして扱えるようにした
    • そしてやり取りはWebSocketでやるように
  • そしてこのタイミングで、`workerd`がWindowsでも動作するようになってる

めでたい!Great work! @mrbbot氏〜👏

Making Cloudflare the best place for your web applications

https://blog.cloudflare.com/making-cloudflare-for-web/

リミット引き上げみたいな大事なことをしれっと書くんじゃない!ありがとうございます!

Announcing Cloudflare Secrets Store

https://blog.cloudflare.com/secrets-store/

  • Secrets Store
    • シークレット aka 環境変数をよしなに保存できるサービスはじめます
  • 現状、Workerにシークレットを登録することはできる
    • GUIからでも`wrangler`からでも
    • 入力したら暗号化されて平文では見れなくなる
  • ただし、Workerごとに保存が必要
    • 同じ外部サービスの同じキーだとしても、別々になる
  • 人間が個別に登録するみたいな不安定さもある
    • セキュリティ担当としては、もっとセキュアになってほしいはず
  • それを解決したいし、野望としてはもっと広い
    • 1Password相当のもの?
  • アクセス可能な範囲を制御しつつ、ワンストップに管理できる
  • アクセスを追跡したり、更新などは監査ログで見れるようにしたり

Cloudflareの使命は、よりよいインターネットを作ることって書いてあったけど、こういう手もあると。

Workers Browser Rendering API enters open beta

https://blog.cloudflare.com/browser-rendering-open-beta/

  • Worker上でブラウザが動かせるようになったよ
    • ブラウザというかChromium、というか`puppeteer`
    • Workerとブラウザのインスタンス間は、DevToolsProtocol over WebSocket
  • `puppeteer`のフォークが動く
  • 特定のURLのキャプチャを返すエンドポイントとか作れる
  • β期間における制限
    • 2ブラウザ/分まで起動できる
    • 2ブラウザ/アカウントまで同時起動できる
    • 何もしないと60sでタイムアウト
  • これから
    • 本家`puppeteer`への追従
    • Chromium以外の対応(Playwrightみたいに)
    • WebDriver BiDi(Google I/Oで言ってたやつね)

なんでもできるようになるなまじで・・。

Cloudflare Queues: messages at your speed with consumer concurrency and explicit acknowledgement

https://blog.cloudflare.com/messages-at-your-speed-with-concurrency-and-explicit-acknowledgement/

  • `queue`イベントのあのCloudlfare Queuesがパワーアップ
    • `fetch`, `scheduled`, `email`, `queue`のやつ
  • キューを処理する(Consumer)側が並列実行されるように
  • `max_concurrency`も指定できる(1〜10)
  • 細かくバッチの可否を制御できるようになった
    • `msg.ack()`, `msg.retry()`
    • `batch.ackAll()`, `batch.retryAll()`
  • これから
    • Workerだけでなく、R2をConsumerにしてバケットに書き出せるようにしたい
    • よしなにメッセージをPULLできるREST APIを用意したい

残念ながら使ったことはないけど、便利そうやなってずっと思ってる。

More Node.js APIs in Cloudflare Workers — Streams, Path, StringDecoder

https://blog.cloudflare.com/workers-node-js-apis-stream-path/

やっぱ人類はNode.jsの遺産なしには生きられないって感じ?

D1: We turned it up to 11

https://blog.cloudflare.com/d1-turning-it-up-to-11/

  • D1もアップデート
  • 裏側のアーキテクチャが新しくなって、パフォーマンスがめちゃあがった
  • `--experimental-backend`としてDB作ればもう使える
    • 近いうちにデフォルトになるけど
  • `TEXT`型の文字列をJSONパースして取り出したりできるようになった
    • `json_extract('{"temp":"78.3", "sunset":"20:44"}', '$.temp')`で`"78.3"`になる
    • そんなことが・・って思ったらSQLiteで元からできることらしい
    • JSON Functions And Operators
  • DBのロケーションを指定できるようになった
    • wnam: Western North America
    • enam: Eastern North America
    • weur: Western Europe
    • eeur: Eastern Europe
    • apac: Asia-Pacific
    • 今はこの5つで、デフォルトだとDB作成コマンドを叩いたロケーションに近いところ
  • コストまわり
  • レプリケーション対象がグローバルに広がっても、それで料金が増えたりはしない
  • 4KBのreadと1KBのwriteの単位で課金される
    • インデックスを貼ってデータを減らせば、その分コストが浮く
  • 新バックエンドでは、タイムトラベルが可能に
    • 直近30日以内なら、分単位でリストアできる
    • SQLiteのWrite-Ahead Logを全部残してあるので可能なんですって
  • これから
    • DBのサイズを1GBまでに for Paidプラン
    • 自動リードレプリカ

すごい(語彙力)

まとめ

D1の足音が聞こえる・・・!

おそらく次のタイミングで、レプリケーションとか整合性とかそのあたりに踏み込んだ内容が出てくるんやろな。