今年も祭りの季節がやってきましたね。
というわけで、今年も個人的に気になったものを。
(発表されるのがだいたいJST深夜かつ最後が金曜日なので、どうやっても公開するの週明けになるんよな・・)
Introducing Constellation, bringing AI to the Cloudflare stack
- Workersで機械学習のモデルが動かせるようになったとのこと
- プライベートβ
- サポートされているランタイムで動作するモデルであれば、自作のものでも、用意されてるものでもOK
- 現状はONNX形式のみ対応
- プライベートβでは、モデルのサイズは10MiBまで
- ちっさくない?
- 用意されてるモデルは、`wrangler constellation catalog list`でみれる
- そのアカウントでConstellationが有効可されてる必要あり
- コードとしては薄いラッパーを介して使う
- `import { Tensor, run } from "@cloudflare/constellation";`
- コードの置き場は見つけられなかったけど、中身は依存0で345行のちょっとしたコード
- https://developers.cloudflare.com/constellation/platform/client-api/
ML界隈に詳しくないのでこれが実用的なのかはよくわからないけど、敷居が下がってくる分にはうれしい。
Introducing Cursor: the Cloudflare AI Assistant
https://blog.cloudflare.com/introducing-cursor-the-ai-assistant-for-docs/
- CloudflareのDocsについて教えてくれるAIアシスタントができたよ
- 名前はCursorくん
- https://developers.cloudflare.com/workers/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つ立てるだけ
- 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が話せるようになった
- `import { connect } from 'cloudflare:sockets'`
- https://developers.cloudflare.com/workers/runtime-apis/tcp-sockets/
- ただ25番ポートのSMTPは許可してないらしい
- 1リクエストで使える最大同時接続数6の1つにカウントされる
- `connect()`のAPIについては、いろいろな経緯でこうなった
- 既存の実装もいろいろあって、どれかに合わせるべきかとか
- 最終的にはオリジナルになったけど、WinterCGにフィードバックしていく予定
- このタイミングでは、PostgresDBがサポート済
- 次はMySQLのサポートを進めているところ
- 現状の課題として、1リクエストごとに、1コネクションを開いて閉じる必要があることは認識してる
- コネクションプーリングに代わる仕組みを検討中
- さらに今後
- 今はOutboundだけだが、いずれはInboundも
- UDPやQUICも、前にアナウンスしてたSocketWorkerで対応したい
- https://blog.cloudflare.com/introducing-socket-workers/
- ↑で紹介したSmart Placementにも対応予定
なんでもできるようになるな・・・!
Improved local development with wrangler and workerd
- `wrangler` CLIがついにv3に
- `workerd`を使ってローカルで開発できるようになった
- つまり本番とまったく同じランタイムってこと
- そして今度こそ、ローカルがデフォルトの挙動に
- 内部的にはちょっと大変だった
- KV, R2, D1なんかは引き続きMiniflareがNode上でシミュレートする
- ストレージは抽象化されたSQLiteが一手に担う
- Miniflareのv2で実装されたユニットテストの環境も
- すべてがNode上にあった頃は、ランタイムAPIをモックするだけでよかった
- しかし`workerd`は別プロセスになるので、簡単にはいかない
- Nodeの`worker_threads`を使うように、`workerd`をスレッドとして扱えるようにした
- そしてやり取りはWebSocketでやるように
- そしてこのタイミングで、`workerd`がWindowsでも動作するようになってる
めでたい!Great work! @mrbbot氏〜👏
Making Cloudflare the best place for your web applications
- (CloudflareスタックはいいぞっていうPR & サマリ記事かと思ってたらちょっと違った)
- 近いうちに、各種リミットを引き上げる予定
- C3: Create Cloudflare CLI
リミット引き上げみたいな大事なことをしれっと書くんじゃない!ありがとうございます!
Announcing Cloudflare Secrets Store
- Secrets Store
- シークレット aka 環境変数をよしなに保存できるサービスはじめます
- 現状、Workerにシークレットを登録することはできる
- ただし、Workerごとに保存が必要
- 同じ外部サービスの同じキーだとしても、別々になる
- 人間が個別に登録するみたいな不安定さもある
- セキュリティ担当としては、もっとセキュアになってほしいはず
- それを解決したいし、野望としてはもっと広い
- 1Password相当のもの?
- アクセス可能な範囲を制御しつつ、ワンストップに管理できる
- アクセスを追跡したり、更新などは監査ログで見れるようにしたり
Cloudflareの使命は、よりよいインターネットを作ることって書いてあったけど、こういう手もあると。
Workers Browser Rendering API enters open beta
- Worker上でブラウザが動かせるようになったよ
- `puppeteer`のフォークが動く
- https://github.com/cloudflare/puppeteer
- 一部のAPIを、CFWのランタイムのやつを呼ぶようにしてあるだけ
- 特定のURLのキャプチャを返すエンドポイントとか作れる
- https://radar.cloudflare.com/scan でやってるような
- β期間における制限
- 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`イベントのあのCloudflare Queuesがパワーアップ
- `fetch`, `scheduled`, `email`, `queue`のやつ
- キューを処理する(Consumer)側が並列実行されるように
- https://developers.cloudflare.com/queues/learning/consumer-concurrency/
- デフォルトは最大`10`らしい
- 最初からというより、徐々に増えていく
- `max_concurrency`も指定できる(1〜10)
- 細かくバッチの可否を制御できるようになった
- `msg.ack()`, `msg.retry()`
- `batch.ackAll()`, `batch.retryAll()`
- これから
残念ながら使ったことはないけど、便利そうやなってずっと思ってる。
More Node.js APIs in Cloudflare Workers — Streams, Path, StringDecoder
https://blog.cloudflare.com/workers-node-js-apis-stream-path/
- Node.jsのAPIサポートがまた増えた
- 少し前にまとめた記事がもう古くなったわ・・・
- Cloudflare Workersの、Node.jsとの互換性について - console.lealog();
- `node:stream`, `node:stream/consumers`, `node:stream/promises`
- (WHATWG Streamあるのに・・)
- `node:path`
- `node:string_decoder`
- (`TextDecoder`あるのに・・)
やっぱ人類はNode.jsの遺産なしには生きられないって感じ?
D1: We turned 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作成コマンドを叩いたロケーションに近いところ
- コストまわり
- 今年の末までは無料で、それ以降は課金対象に
- https://blog.cloudflare.com/content/images/2023/05/Screenshot-2023-05-19-at-10.14.58.png
- レプリケーション対象がグローバルに広がっても、それで料金が増えたりはしない
- 今時点ではレプリケーションされてないこと忘れてたわ
- 4KBのreadと1KBのwriteの単位で課金される
- インデックスを貼ってデータを減らせば、その分コストが浮く
- 新バックエンドでは、タイムトラベルが可能に
- 直近30日以内なら、分単位でリストアできる
- SQLiteのWrite-Ahead Logを全部残してあるので可能なんですって
- これから
- DBのサイズを1GBまでに for Paidプラン
- 自動リードレプリカ
すごい(語彙力)