Upyo 0.3.0: マルチプロバイダーのレジリエンスとデプロイメントの柔軟性

洪 民憙 (Hong Minhee) @hongminhee@hackers.pub

Upyo 0.3.0では、ライブラリのメール配信機能を拡張する3つの新しいトランスポートが導入されました。このリリースでは、マルチプロバイダーサポートによる信頼性の向上と、さまざまな組織のニーズに合わせたより多くのデプロイメントオプションの提供に焦点を当てています。

マルチプロバイダーのレジリエンスを実現するプールトランスポート

新しい*@upyo/pool*パッケージは、複数のメールプロバイダーを単一のトランスポートに統合するプールトランスポートを導入しています。これにより、アプリケーションは異なるプロバイダー間でメールトラフィックを分散し、あるプロバイダーに問題が発生した場合に自動的にフェイルオーバーすることができます。

プールトランスポートはいくつかのルーティング戦略をサポートしています。ラウンドロビン配信はプロバイダー間で均等にサイクルし、重み付け配信では優先プロバイダーを通じてより多くのトラフィックを送信できます。優先度ベースのルーティングは常に最も優先度の高いトランスポートを最初に試み、必要な場合にのみ他のトランスポートにフォールバックします。より複雑なシナリオでは、メッセージの内容、受信者ドメイン、またはその他の基準に基づいてカスタムルーティングを実装できます。

import { PoolTransport } from "@upyo/pool";
import { SmtpTransport } from "@upyo/smtp";
import { MailgunTransport } from "@upyo/mailgun";

const pool = new PoolTransport({
  strategy: "priority",
  transports: [
    { transport: primaryProvider, priority: 100 },
    { transport: backupProvider, priority: 50 },
    { transport: emergencyProvider, priority: 10 },
  ],
  maxRetries: 3,
});

const receipt = await pool.send(message);

このトランスポートは、メール配信の失敗を許容できない高可用性システムにとって特に価値があります。また、大量のメールをより経済的なプロバイダーにルーティングし、トランザクションメールをプレミアムサービスを通じて送信することで、コスト最適化も可能にします。メールプロバイダー間を移行している組織は、重み付け配信を使用して、あるプロバイダーから別のプロバイダーへトラフィックを徐々にシフトさせることができます。プールトランスポートはAsyncDisposableサポートを通じてリソースのクリーンアップを適切に処理し、試行されたすべてのプロバイダーからの失敗を集約する包括的なエラーレポートを提供します。

詳細な設定オプションと使用パターンについては、プールトランスポートのドキュメントを参照してください。

インストール

npm  add     @upyo/pool
pnpm add     @upyo/pool
yarn add     @upyo/pool
deno add jsr:@upyo/pool
bun  add     @upyo/pool

Resendトランスポート

@upyo/resendパッケージは、開発者体験を念頭に設計された最新のメールサービスプロバイダーであるResendのサポートを追加します。Resendは、本番アプリケーションに必要な機能を犠牲にすることなく、シンプルさに重点を置いています。

Resendの強みの一つは、インテリジェントなバッチ最適化です。複数のメールを送信する際、トランスポートはメッセージの特性に基づいて最も効率的な送信方法を自動的に決定します。添付ファイルのないメッセージは、最適なパフォーマンスのためにResendのバッチAPIを使用して送信され、必要に応じて個別のリクエストにシームレスにフォールバックします。この最適化は透過的に行われ、追加の設定は必要ありません。

import { ResendTransport } from "@upyo/resend";

const transport = new ResendTransport({
  apiKey: "re_1234567890abcdef_1234567890abcdef1234567890",
});

const receipt = await transport.send(message);

Resendはまた、ネットワークの問題やアプリケーションの再試行中に重複送信を防ぐための組み込みの冪等性(べきとうせい)を提供します。トランスポートは冪等性キーを自動的に生成しますが、必要に応じてカスタムキーを提供することもできます。指数バックオフを使用した包括的な再試行ロジックと組み合わせることで、一時的なサービス中断中でも確実な配信を保証します。メッセージタグ付けのサポートは、メールの整理とResendの分析ダッシュボードを通じて異なるタイプの通信のパフォーマンスを追跡するのに役立ちます。

Resendトランスポートガイドでは、設定と高度な機能に関する包括的なドキュメントを提供しています。

インストール

npm  add     @upyo/resend
pnpm add     @upyo/resend
yarn add     @upyo/resend
deno add jsr:@upyo/resend
bun  add     @upyo/resend

Plunkトランスポート

@upyo/plunkパッケージは、クラウドホスト型とセルフホスト型の両方のデプロイメントオプションを提供するメールサービスPlunkのサポートを追加します。この柔軟性により、Plunkは特定のインフラ要件を持つ組織にとって興味深い選択肢となります。

多くのチームにとって、コンプライアンスやデータ主権の理由から、メールインフラをセルフホストする能力は非常に重要です。Plunkのセルフホストオプションはdriaug/plunkイメージを使用してDockerコンテナとして実行され、シンプルで最新のAPIを維持しながら、メールインフラを完全に制御できます。同じコードベースは、クラウドとセルフホストの両方のインスタンスでシームレスに動作し、必要なのはベースURLの設定が異なるだけです。

import { PlunkTransport } from "@upyo/plunk";

// クラウドホスト型
const cloudTransport = new PlunkTransport({
  apiKey: "sk_1234567890abcdef1234567890abcdef1234567890abcdef",
});

// セルフホスト型
const selfHostedTransport = new PlunkTransport({
  apiKey: "your-self-hosted-api-key",
  baseUrl: "https://mail.yourcompany.com/api",
});

Plunkトランスポートには、指数バックオフによる再試行ロジック、包括的なエラー処理、添付ファイルのサポート(PlunkのAPI制限に従い、メッセージあたり最大5つ)など、期待される本番機能が含まれています。タグによるメッセージ整理は異なるタイプのメールを追跡するのに役立ち、優先度レベルは緊急メッセージが適切に処理されることを保証します。また、トランスポートはAbortSignalによるリクエストのキャンセルをサポートしており、アプリケーションがタイムアウトやユーザーが開始したキャンセルを適切に処理できるようにします。

完全なドキュメントとデプロイメントガイダンスはPlunkトランスポートドキュメントで利用できます。

インストール

npm  add     @upyo/plunk
pnpm add     @upyo/plunk
yarn add     @upyo/plunk
deno add jsr:@upyo/plunk
bun  add     @upyo/plunk

移行ガイド

すべての新しいトランスポートはUpyoの一貫したAPI設計を維持しており、既存のトランスポートとの置き換えが容易です。同じメッセージ作成と送信コードがどのトランスポートでも動作します:

import { createMessage } from "@upyo/core";

const message = createMessage({
  from: "sender@example.com",
  to: "recipient@example.com",
  subject: "Hello from Upyo!",
  content: { text: "Works with any transport!" },
});

const receipt = await transport.send(message);

今後の予定

私たちは、ライブラリのシンプルさ、型安全性、クロスランタイム互換性に焦点を当てながら、Upyoのトランスポートオプションの拡張に取り組み続けています。皆様のフィードバックと貢献がプロジェクトの方向性を形作るのに役立ちます。


完全な変更ログと技術的な詳細については、CHANGES.mdを参照してください。

質問や問題がある場合は、GitHubリポジトリにアクセスしてください。

3

No comments

If you have a fediverse account, you can comment on this article from your own instance. Search https://hackers.pub/ap/articles/01995113-910d-7f58-bd0e-688defa9aa68 on your instance and reply to it.