Webメッセンジャーと「beforeunload」イベント:ページを閉じるときに100万のメッセージを保存する方法







夏の終わりに、Voximplantクラウドにメッセージングサポートを追加しました 。 これで、さまざまなプラットフォーム用のSDKを使用して、独自のモバイルメッセンジャーまたはWebメッセンジャーを作成できます。電話ネットワークとSDKの間に音声通話があり、SDK間にビデオ通話があり、メッセージングがあります。 また、テキストメッセージは、音声通話やビデオ通話とは大きな違いがあります。その内容はそのままにしておきます。 Voximplantはクラウド側で音声通話とビデオ通話を記録し、生成されたファイルのURLを提供できますが、これはCRM、注文管理システム、コールセンターの「遅い」話です。 そして、メッセージは簡単な話です。 Skypeで「古い」チャットをクリックするとモバイルまたはWebアプリケーションがフリーズし、不安定な3Gを介してロードされたサーバーから少なくとも一部の履歴をダウンロードしようとすると、ユーザーは非常に腹を立てます。 SDKでは、メッセージの履歴をできるだけ早く処理するためのいくつかのメカニズムを提供しています。



実際、問題は何ですか?



新しいメッセンジャーユーザーは、APIへのアクセスを提供し、イベントを受信できる単一のMessengerオブジェクトで開始します。 ユーザー間の通信は、ユーザーの1人がConversationオブジェクト(2つ以上の「会話」または「チャット」)を作成し、 sendMessageオブジェクトメソッドを使用してメッセージの交換を開始すると開始されます。 クライアントは、イベントを通じてイベントについて学習します。 たとえば、ユーザー「A」が初めてユーザー「B」にメッセージを送信したい場合、2つの会話を作成します。その後、両方のユーザーに対してCreateConversationイベントが到着し、ユーザー「B」がユーザーと通信したいと判断します。 また、イベントは、会話に参加する新しいメッセージと会話を離れるユーザー、管理ステータスの変更、またはユーザーがテキストを入力していることを通知します。



これらのすべては、ユーザーの1人がチャットタブを閉じるまで継続します。 そして、一日おきに再びそれを開きません。 または1ヶ月で。 または一年で。 ユーザーが不在中に起こったすべての新しいことを見るために、開発者は何をする必要がありますか? できればブラウザを一時停止しないようにしてください。



シリアル化と番号付け-メッセージ履歴の2つのクジラ



メカニズムの主な詳細は、会話内のすべてのメッセージの連番です。 SendMessageイベントには、メッセージの一意の識別子を含むseqフィールドがあります。 識別子は会話内で一意であり、常に増加しています。 したがって、ブラウザーページを閉じて1年後に開いて、この間に到着した新しいメッセージを確認したい場合は、最後に受信したメッセージのシーケンスIDをどこかに保存するだけで、ページを開いた後、クラウドから欠落しているメッセージを要求できます。 または、たとえば、最後の数ダース、ユーザーがログを見ることを決めた場合にのみ残りをロードします。







補助的な詳細はシリアル化です。 SDKは高レベルであり、オブジェクトで動作します。 たとえば、会話の新しいメッセージを受信する場合、まずgetConversationを使用してこの会話のオブジェクトを取得し、次にこのオブジェクトのメソッドretransmitEventsを使用してメッセージを取得する必要があります



しかし、ページをロードしたばかりの場合、どこからオブジェクトを取得できますか? localStorageに慎重に保存されているIDがたくさんあります。 そして、オブジェクトを作成する必要があり、そのようなオブジェクトの各作成は、必要な情報を取得するためのクラウドへのリクエストです。



このソリューションは、 toCacheおよびcreate ... FromCacheメソッドを使用してオブジェクトをシリアル化するための組み込みメカニズムであり、オブジェクトの内部のJSON表現を作成し、サーバーにアクセスせずにそのようなJSONからオブジェクトを復元できます。 また、JSONはlocalStorageに保存でき、ページが読み込まれるとすぐに100のチャネルと100万のメッセージを回復できます。



100万メッセージ-JavaScriptまたはlocalStorageはバーストしませんか?



Webページでは、デスクトップアプリケーションやモバイルアプリケーションとは異なり、すべてが複雑です。 ユーザーが「タブを閉じる」または「ブラウザーを閉じる」コマンドを実行すると、「beforeunload」イベントがトリガーされ、サブスクライブできます。 Googleドキュメントの「保存されていないデータがあります」というメッセージは、開発者がハンドラーから返した文字列です。 以前は、アラートを作成することもできましたが、詐欺ページ「ブラウザがロックされ、お金を与えている」は、ブラウザ開発者に「beforeunload」ハンドラで許可することはあまりないことをやさしくほのめかしました。



ただし、最新のブラウザでは、このようなメッセージが表示される前に数秒でコードが表示され、ユーザーは心配し始めます。









そして、数秒で、localstorageの数百のメッセージで数百の会話をシリアル化することができます。 ただし、ここで重要なのは、デフォルトではlocalStorageが5〜10メガバイトに制限されており、モバイルブラウザーやユーザーが設定を詳しく調べた場合はさらに少ないことです。



何も破裂しないためのベストプラクティス



新しい「Skype for Web」を作成し、ユーザーからの非常に多くのメッセージを計画している場合、すべての一般的なブラウザーでサポートされているindexedDBを使用して、シリアル化されたオブジェクトを保存することをお勧めします。 そこにはもっと多くのデフォルトのクォータがあり、「クォータ管理API」と特定のブラウザのピースを使用しても、ユーザーに明示的に尋ねることができます。



2番目のポイント-最後の訪問からの会話で多くのメッセージが蓄積された場合、最後の数十をサーバーに要求し、ユーザーがログをスクロールした場合にのみ残りをロードするのが賢明でしょう。 それは一種の「逆無限スクロール」であることがわかります。Facebookページをスクロールするときのように、下から新しい要素が表示されるのではなく、上から表示されます。



今年は、メッセージングを大幅に拡張し、HTTPおよびWebhookを介した制御を追加する予定です。 これにより、開発者は他のインスタントメッセンジャー、「オペレーターとのチャット」などのプログラムメッセージ管理、その他の興味深いものと統合できます。



All Articles