Skip to content

タイムライン

timelineはmessageやassociationを時系列に並べたものです。concurrent.worldでは、ユーザータイムラインやコミュニティタイムラインがこれを用いて実装されています。 タイムラインはユーザー所有のものとドメイン所有のものがそれぞれ選択できます。これは、ユーザーのホームタイムラインはユーザーが引っ越した場合に一緒に引っ越されるべきですが、コミュニティタイムラインなど共用性の高いタイムラインはその件数も多くなることが想定され、ユーザーの引っ越しに伴って移動が必須になるのは大変だからです。

リアルタイムセッション

Concrntはwebsocketを使ってリアルタイムイベントを受信できます。 また、受信したいタイムラインが複数サーバーにまたぐ場合でも、自分の所属するサーバーだけにソケットを張っておけば、そのサーバーが間接的に外部サーバーのイベントをリレーしてくれます。

Concrntのリアルタイム購読フロー

タイムラインの購読

Concrntはのタイムラインの購読はオンデマンドです。このデザインは、愚直な実装ではレスポンスが遅くなってしまうものの、キャッシュによって効率的に行うように工夫されています。 Concrntはタイムラインを10分間隔のチャンクに分割しており、これによりデータの管理が容易になります。

また、タイムラインのチャンクは基本的にスパースになりがちです。例えば、深夜帯はメッセージの件数が減りますよね。ですので、タイムラインのデータそのものを保有するチャンクに加えて、最寄りのデータチャンクへの参照を保持するイテレーターチャンクを中間に挟んでいます。 こうすることで、より効率よくタイムラインのデータを保持・解決することができます。

イテレーターチャンクとデータチャンクの関係

タイムラインを購読する際には、これらのチャンクがキャッシュから一括で取得され、キャッシュミスがあった場合はDBないしはネットワークから追加の取得が行われます。その後、必要な範囲のデータのみがソートされ、ユーザーに返却されます。

この方法では、一見すると過去10分に満たない最新のチャンクはキャッシュできません。というのも、内容が未確定なのでいつ更新されるかが分からないからです。 ですが、前節で述べた通り、Concrntにはリアルタイムのセッションの仕組みがあります。これを用いて、10分のウィンドウの間にユーザーの要求によって作成されてしまった未確定のチャンクのキャッシュに関しては チャンクの内容が確定する時刻が来るまでリアルタイムでキャッシュを更新し続けています。

Concrntはこのような仕組みにより、ローカルだけでなく複数のリモートを織り交ぜた、様々なタイムラインからなるタイムラインをユーザーに迅速に提供しています。