これは この質問 よりも深い質問です。
分散型システムでチャットメッセージが送信されると、複数のイベントが連続して発生します。メッセージがFacebook MessengerやSlackやその他のほとんどのメッセージングシステムなどのルーティングサーバーを介して送信される場合、次のことがこの順序で行われます。
さらに、上記と交互に次のことが起こります。
これらのイベントの順序には多くの不確実性があり、それらの間には数分、数時間、または数日さえある場合があります。
メッセンジャーは表示することでユーザーにいくつかのフィードバックを提供します
さらに、複数のデバイスでの複数のメッセージの順序は不明確です。ベクトルクロックなどの手法を使用して、部分的な順序付けを理解できますが、完全な順序付けは不可能です。ユーザーの時計が正しく設定されていない場合、またはメッセージが送信されてもサーバーに到達するのに1時間かかる場合は、ユーザーがセルタワーのカバレッジを失ったためか、さらに困難になります。
この質問には2つの部分があります。
いつメッセージにタイムスタンプを付けますか?
次に、メッセージを表示する順序は?
タイムスタンプでメッセージを並べ替えると、ユーザーのデバイスでタイムスタンプが生成されるか、メッセージがサーバーのどこかに滞っている場合、メッセージが数分または数週間後にチャット履歴に忍び込む可能性があります。ベクトルクロックで物事を注文すると、画面に表示される注文メッセージがタイムスタンプと一致しない場合があります。
ユーザーエクスペリエンスの観点から考えてほしい。セキュリティ、パフォーマンス、数学的な正確さなど、他にも重要な見方がありますが、現時点ではそれらの観点からのフィードバックは必要ありません。
ユーザーの健全性を維持するために、2つのことを強くお勧めします。
会話のすべての参加者に常に同じ順序でメッセージを表示します。
会話の参加者ごとに異なる方法でメッセージをフィルタリングできるような方法でメッセージをフィルタリングしようとしないでください。
そうは言っても、可能であれば、中央サーバーがメッセージを受信した順序にすることをお勧めします。必要に応じて、メッセージに送信時刻を注釈として付けることができます。
これらのルールの主な理由は、参加者が会話の流れを異なる方法で理解する意図的または偶発的な状況を防ぐためです。
真実の事実のタイムスタンプは、サーバーのUTC時間です。
問題は、クライアントデバイスが常にオンラインであるとは限らないことです。モバイルにはWiFiもネットワークもないため、リクエストはキューに入れられます。また、クライアントはデバイスの時間を調整できます。
経験上、デバイスがオフラインである間、クライアントがデバイスの時間を調整しないようにする方法はありません。しかし、これは、正確なユーザーイベントタイミングに依存するシステム(ユーザーが作業の開始と終了を報告する)に対して、私たちが思いつくことができる最高のものです。
あなたが私に尋ねれば、ほとんどのシナリオにとって完全なやり過ぎですが、これが役に立てば幸いです。