イベント・ストリーミングの問題解決

<font color="Grey">*[Solving problems with event streaming](https://aiven.io/blog/solving-problems-with-event-streaming)の翻訳です。*</font>

2022年11月9日

# イベント・ストリーミングの問題解決

私たちのデータコミュニティの素晴らしいイノベーターたちが直面している課題と、イベントストリーミングがどのようにその課題を解決するのに役立っているのか（友人たちからのちょっとした助けもあり）、ご覧ください。

## ジェームズ・ジョブズAGの紹介


私はJames Jobで働くニックです。James Jobは、あなたのスキルに合った求人情報を見つける方法に革命を起こすスタートアップです。


求人広告の中から自分に合った仕事を探すのは面倒なものです。James Jobでは、あなたのスキルセットを定義すると、それにマッチした求人広告を計算してくれます。


その結果、関連性の高い求人広告のみを表示するために、舞台裏で多くのことを計算するアーキテクチャを採用しています。求人広告の変更、新たなスキルの習得など）発生する変化は、また私たちのシステムで多くの計算を引き起こします。Apache Kafka®は完璧なバックボーンを提供してくれます。


新興企業である私たちにとって、新しいアイデアやユースケースなどを迅速かつ柔軟に構築できることも非常に重要です。動きのあるデータと（必要に応じて）無限に保持されるデータは、まさに私たちの手の中にあるのです。


また、これだけでは十分でないとしたら、私たちはAivenのCrabbyの大ファンでもあります。）


## コミュニケーションへの挑戦


マイクロサービスやナノサービスの台頭は、結局のところ、より多くのコンポーネントを接続する必要があることを意味する。APIやRPCなどでこれを実現することは可能だが、これはコンポーネントの緊密な結合を意味する。あるサービスに変更を加えると、その後の変更に波紋が広がる可能性がある。イベントを使えば、すべてがより自由で柔軟なものになると思いたい。


どんなサービスでも、イベントの送信やリッスンを始めることができる。システムを流れるデータはオープンな世界であり、多くの可能性が広がる。以下のセクションで、いくつかの利点と課題について概説しよう。


私たちはすでに多くのデータを持っているが、ほとんどの場合、それはデータベース、インデックス、ファイルなどに静止している。必要なデータを得るためには、あるハードルを越えなければならない。


知る必要がある：


* どこでそれを見つけるか（多くのデータシステムと構造）
* どのようにアクセスするか（統合）
* データ構造がどのように機能するか（一般的にドキュメントはない）


イベントの使用


* データへのアクセスが合理化される
* データ構造が文書化されている（Avro、Protobufなど）
* 優れた命名ポリシーにより、データを見つけやすい。


## システムダウンがない


簡単な例から始めよう：ユーザー登録。


サインアップのプロセスは、数個の入力フィールドから数ページにわたるものまで様々です。  

最もイライラさせられるのは、最後に**サインアップ**ボタンをクリックしたときに、後で再試行するようエラーが表示されることだ！これはイライラさせられるだけでなく、非常に具体性に欠け、役に立つとは言い難い。


イベントを使うのであれば、サインアップサービスがダウンしたときのユーザーへの影響を最小限に抑えることができます。


イベントをApache Kafka®に送信するだけです。


サインアップ・サービスが回復するとすぐに、サインアップ・イベントが処理され、アカウントが正常に作成されたというメールがユーザーに届く。


アカウントがすぐに作成されなかったことはまだ気になるが、ユーザーはサインアップのプロセスを再度行う必要はない。すべての人にとっての勝利である。


## 歴史は繰り返す


歴史は繰り返される。


Apache Kafka®では、イベントに無限の保持を選択できます。これはどのように便利なのでしょうか？


例えば、1年後、最初の100人の顧客にサプライズプレゼントをしたいが、ユーザーの作成日を保存するのを忘れてしまったとします。


イベントがなければ、これは不可能なハードルです。しかし、イベントがあれば、サインアップイベントを再生し、幸運な当選者を見つけることができます。


これは必ずしもありそうなシナリオではありませんが、過去のデータを使って新しいユースケースを構築するためにイベントを再生する方法を示しています。


既存のシステムからデータを抽出して変換する必要がなくなれば、ゼロから新しいサービスを構築するのはより簡単になる。必要なのは


* 必要なデータ・ストリームを特定する
* 過去のイベントを再生する
* 必要に応じて、これらのイベントを永続化／変換／リアクトする


これは、長年にわたって多くのユースケースで時間を節約してきた。データについてもっと考えることを促し、多くのことを簡単にしてくれる。


あらゆるニーズに合うデータ構造を持とうとする代わりに、コンポーネントがそれを必要とする場合、カスタムデータプロジェクションを構築するのは簡単だ。その結果、すべてのコンポーネントがより独立したものになります。


## 遅れていること


イベントの送信は、ある時点で何かが起こることを意味する。  

場合によっては、システム内で起こる他の出来事に依存することになります。  

すべてがデカップリングされているので、コンポーネントと直接通信する方法はない。


そこで、あるユーザーがメールアドレスと住所を登録したとしよう。また、そのために2つのイベントを選択するとしよう：


* ユーザーアカウントイベント
* ユーザ・アドレス・イベント


サインアップ後、ユーザーはプロファイルにリダイレクトされます。これらのイベントは異なるシステムによって処理されるため、以下のようなことが起こり得ます：


* ユーザーアカウントはまだ作成中です。
* アドレスサービスがダウンしている。
* アドレス・サービスは稼動しているが、ユーザー・サービスより速い。


この種の問題は、データが静止しているときでも常に存在する。しかし、イベントの場合、私たちはそれをより頻繁に考える傾向がある。


不確実性はシステムに課題をもたらす。では、イベント駆動型アーキテクチャでこれを解決するにはどうすればいいのだろうか？


より良いシステムを構築するためには、次のようなこと（他にもたくさんある）が役に立つ：


* 欠損データに対する耐性
* 柔軟なデータロード（例：スケルトンのロード）
* 他のコンポーネントで起きていることに関するライブイベント（プッシュ通知）


例えば、アドレス・サービスが遅くなった場合、私たちはすでにアカウント情報を見ることができ、アドレスはロード状態を持ち、データが利用可能になった直後にリフレッシュされる（プッシュ対ポーリング）。


Apache Kafka®は非常に高いスループットのために構築されているため、多くのシナリオでは遅延は目立ちませんが、予期せぬ事態を常に念頭に置いておくとよいでしょう。


## 結論


どんなテクノロジーにも利点と課題がある。長年にわたり、私はイベント・ストリーミング・アーキテクチャの利点が課題をはるかに上回ることを発見した。


Apache Kafka®には学習曲線があります！  

一度 "イベントファースト "の考え方を受け入れると、アプリケーションはより弾力的で安定し、柔軟になります。Apache Kafkaには素晴らしい統合のエコシステムがあるので、多くの新しい機会とユースケースが開かれるでしょう。


これまでの道のりは本当に素晴らしいものでした。


長年にわたって私たちの建築を成長させてくれた、素晴らしい信頼できるパートナーであるAivenチーム全員に感謝します💖。


### ニックについて


ニック・チウは[James Job AG](https://jamesjob.com/)のCTIOであり、最小限の労力で求職者に最適な仕事を提供するスタートアップ企業である。彼は20年以上ソフトウェアサービス構築の分野で働いており、様々な業界で働く機会があったため、ソリューションアーキテクチャに関する多くの洞察を得ることができた。5年前からイベント・ドリブン・システムに注力しており、長年にわたって構築してきた多くのソリューションの設計図として、その素晴らしさが証明されている。食べ物とマンガが大好き。



Aivenと私たちのサービスに関する最新ニュースや、オープンソースに関する様々な情報を入手するには、[月刊ニュースレターを購読する](https://aiven.io/newsletter)！Aivenに関する日々のニュースは、[LinkedIn](https://www.linkedin.com/company/aiven/)と[Twitter](https://twitter.com/aiven_io)のフィードでご覧いただけます。