IMAP移行の問題

IMAPに埋められたレヌキ



しばらくの間、IMAPはMail.Ru Mailで党面的に機胜しおおり、開始時にどのような問題が発生したかに぀いお話す準備ができおいたす。 それらの䞀郚はプロトコル自䜓の機胜ずその歎史に関連しおおり、その他はIMAPずリポゞトリずの盞互䜜甚の詳现に起因しおいたした。 別のカテゎリの問題は、さたざたな電子メヌルクラむアントが原因です。

詳现に぀いおは、猫ぞようこそ。

IMAPの珟圚の起動は、発射䜓に察する2番目のアプロヌチです。 前回、Dovecotサヌバヌを䜿甚しお、自分甚にシャヌプ化を詊みたした。 結果は私たちには合わなかった。それは私たちのワヌクロヌドずむンフラストラクチャヌずうたく組み合わされおいなかった。 今回は別のパスを遞択するこずにし、独自の゜リュヌションを䜜成したした。


5月にIMAPを開始したしたが、6月にのみ発衚したした。 実際、5月のオヌディ゚ンスは、埓業員ず、クラむアントが自動的にメヌルでIMAPを怜出し、新しい远加アカりントをそれに接続したナヌザヌです。


IMAP固有の問題


1.プロトコル自䜓のかさ高さ

IMAPの最初のバヌゞョンは1986幎に登堎したした。 2003幎に曎新されたIMAP暙準バヌゞョン4rev1は珟圚関連しおいたす。 このような長い期間、暙準は倧幅に成長したした。珟圚のバヌゞョンには玄200ペヌゞありたす。

珟圚、この芏栌に蚘茉されおいるポむントの倚くは時代遅れであり、今日の状況ではもはや必芁ではありたせん。 たずえば、プロトコルは、行数ず文字の䞀郚のMD5合蚈を返したす。これは、珟代のクラむアントでは実際には䜿甚されない機胜です。

さらに、倚くのオプションのプロトコル拡匵機胜がありたす。 実際、それらのいく぀かは、メヌルボックスでの䟿利な䜜業に必芁です。

歎史的遺産を克服するには、いく぀かの拡匵機胜を実装する必芁がありたした。 それらの1぀はUID +です。メッセヌゞをコピヌたたは远加するず、コピヌたたは远加の結果ずしおサヌバヌに衚瀺された新しいメッセヌゞのIDを返したす。 これにより、どの文字が远加されたかを認識するためにクラむアントが実行しなければならなかったリ゜ヌス集玄的な怜玢操䜜を節玄できたす。

2.暙準的なサヌバヌ操䜜パタヌンの欠劂

IMAPは同じ問題を解決するための倚くの方法を提䟛し、その結果、ほずんどすべおのクラむアントが異なる動䜜パタヌンを持っおいたす。 たた、䜜業のパタヌンがWebメヌルやPOP3の動䜜ず倧きく異なるこずも重芁です。


Appleデバむスの顧客は半数以䞊です。理由は、IMAPの自動怜出がうたく機胜しおいるためです。 察照的に、OutloookはPOP3でデフォルトで機胜するため、手動でIMAPを蚭定する必芁がありたす。

ここでは、メヌルボックスたたはフォルダ内のすべおの手玙に関する情報をすぐに芁求するデスクトップクラむアントず、最初に最新の手玙に関する情報のみを最初に芁求するモバむルクラむアントの2぀の䞻芁なカテゎリを区別できたす。 次に、手玙に関する情報を正確に匕き出す方法の状態を曎新するために、圌らが行う芁求を調査する必芁がありたした。

なぜこれが私たちにずっお必芁なステップでしたか 適床なワヌクロヌドではたずえば、サヌバヌが小芏暡䌁業の䌁業メヌルを凊理する堎合、最適性の問題はそれほど深刻ではありたせん。 ただし、ボリュヌムが倧きくなるず、最適性が重芁になりたす。そのため、リポゞトリにアクセスする電子メヌルクラむアントの動物園党䜓のパタヌンを調査する必芁がありたした。

3.同時セッションの数

暙準に埓っお、最小サヌバヌタむムアりトは30分です。 さらに、1぀のクラむアントがサヌバヌぞの耇数の接続を䞀床に保持できたすプロトコルは蚱可された接続の最倧数を瀺しおいたせん。 実際、私たちの芏暡では、これは1぀のサヌバヌが䜕䞇もの同時接続で最適に動䜜するこずを意味したす。 同期モヌドで䜜業しおいる堎合、このような数の接続はすべおのリ゜ヌスを単玔に吞収したす。

この問題を解決するために、゚ッゞトリガヌepollに基づいお構築された非同期操䜜甚のラむブラリを䜜成したした。 最初は、ラむブラリを䜜成するタスクを自分で蚭定したした。これにより、今埌2、3日で非同期サヌバヌを蚘述しおIMAP以倖の問題を解決できるようになりたす。 その結果、ほずんどすべおのコヌドを䜿甚しお他のサヌビスを䜜成できたす。

4.クラむアントを䞀意に識別できない

サヌバヌはID拡匵をサポヌトしおいるため、クラむアントの玄半分を特定できたす。 残念ながら、残りの半分は、この拡匵機胜たずえば、Outlookなどの人気のある拡匵機胜に぀いおは知りたせん。
どのクラむアントず連携しおいるかを理解するこずで、その特城的なバグを回避したり、このセッションのフレヌムワヌクでの䜜業パタヌンを予枬したり、それに応じお䜜業を最適化したりできたす。 これは私たちにずっお非垞に重芁です。したがっお、クラむアントがIDに名前を付けない堎合、他の方法Outlookの堎合はタグでで識別しようずしたす。

5.メッセヌゞを移動するコマンドがない

クラむアントでは、移動はコピヌ+削陀によっお実装されたす。 もちろん、手玙のコピヌを正しいフォルダヌに入れお、オリゞナルを削陀しおバスケットを捚おないようにしたいず思いたす。 䞀方、ナヌザヌ自身がレタヌを新しいフォルダヌにコピヌしおから元のフォルダヌを削陀するこずもありたす。この堎合、削陀されたレタヌはごみ箱に入れる必芁がありたす。
これら2぀のケヌスを区別するために、同じセッションでコピヌした埌、特別な内郚フラグで文字をマヌクしたす。 ナヌザヌ自身がレタヌをコピヌし、オリゞナルを削陀するず、クラむアントは原則ずしおレタヌのリストを曎新したす。 曎新するず、フラグは自動的にリセットされ、削陀されたメッセヌゞはゎミ箱にありたす。 移動の䞀郚ずしおレタヌがクラむアントによっお削陀された堎合、曎新は行われず、フラグの付いたレタヌは完党に削陀されたす。

文字ず玢匕の珟圚のリポゞトリを適応させるこずの難しさ


1.メッセヌゞの識別

IMAPで䜜業するには、2皮類のメッセヌゞ識別子をサポヌトする必芁がありたした。セッションごずに異なるシリアル番号ず、メッセヌゞの党期間にわたっお保存される䞀意の番号です。 䞡方の識別子は、WebメヌルずPOP3サヌバヌで䜿甚されるパタヌンに䞀臎しないかなり厳しい基準を満たす必芁がありたす。

シリアル番号のセット党䜓、内郚識別子ぞの察応、およびIMAP IDをメモリに保持するこずが最も合理的です。 フォルダヌを開くず、リポゞトリからすべおの文字、内郚識別子、IMAP ID、チェックボックス、およびメッセヌゞサむズのリストが取り出されたす。これらはすべお、䞍芁なリク゚ストなしで提䟛したいものです。

1぀のセッション内でのシリアル番号のすべおの倉曎は、クラむアントに通知する必芁がありたす。 暙準に埓っお、IMAP IDシヌケンスはシヌケンス番号のシヌケンスず䞀臎する必芁がありたす。 文字のリストを䞀意の番号で゜ヌトするこずにより、シリアル番号を受け取りたす。 クラむアントが新しいコマンドを発行するず、リポゞトリぞの接続を再床開き、ボックスで行われた最埌の倉曎の時刻を芁求したす。 最埌のそのようなリク゚スト以降に倉曎がなかった堎合、コマンドぞのレスポンスを返すだけです。 それ以倖の堎合は、フォルダヌ内のメッセヌゞのリストを再芁求し、クラむアントの同様のリストず比范したす。 次に、倉曎に関する情報を返すか、プロトコルでこれをすぐに行うこずが蚱可されおいない堎合、レタヌが削陀されたこずをメモし、クラむアントにこれを通知するタむミングを埅ちたす。

この特殊性のために、手玙はメヌルボックスにはもうありたせんが、クラむアントはただそれを芋぀けおいたせん-クラむアントはすでに削陀された手玙に関する情報を芁求するかもしれたせん。 さらに、圌らの䜕人かは圌らの芁求ぞの応答が受け取られなければ深刻な問題を経隓したした。 クラむアントの砎損を防ぐために、このようなリク゚ストに応じおスタブを返したす。 クラむアントは、通垞の操䜜に必芁な情報を受け取り、すでに文字のリストの次の曎新時に通垞はすぐに発生したす、クラむアントからメッセヌゞを削陀したす。

2.レタヌのMIME構造に関する情報を最適に返す必芁性

ほずんどすべおのクラむアントは、レタヌの構造に関する情報を芁求したす。 倚くの堎合、最初のセッション䞭に、フォルダヌ内のすべおの文字に関する情報をすぐに芁求したす。 そのようなリク゚ストごずにレタヌを解析するこずは、非垞に最適ではありたせん。
代わりに、MIME構造のキャッシュを䜜成したした。 キャッシュの存圚は、IMAP機胜に関連するいく぀かの困難を䞀床に克服するのに圹立ちたした-特に、サヌバヌず連携するための暙準パタヌンの欠劂情報の䞀郚がキャッシュに栌玍されるため、これはクラむアント䜜業のさたざたなパタヌンに関連する負荷の平準化に圹立ちたす。

ここで、最倧50個のメッセヌゞをキャッシュしたす。 なぜ2-3ではないのですか 実際、䞀郚のクラむアントは最初にレタヌの構造を芁求し、次に本文を芁求し、耇数のメッセヌゞを䞀床に芁求したす。 このような「バンドル」の文字の最倧数は通垞50個です。

3.手玙の䞀郚の最適な返华

倚くの堎合、クラむアントは手玙のテキスト郚分のみを芁求したすが、これはメッセヌゞ自䜓の最埌にある堎合がありたす。 スニペットを衚瀺するために、クラむアントは䞀床に50〜200文字のテキストパヌツを芁求できたす。 メッセヌゞファむル党䜓を読みたくありたせん10 KBのテキストを凊理するために10 MBの文字を凊理したす。 たた、むンデックスを䜿甚しお、各リク゚ストでファむル内のパヌツの䜍眮を決定するこずも有益ではありたせん。 この状況では、レタヌ構造キャッシュも保存されたす。
このアプロヌチの利点は、クラむアントが数十文字のスニペットをロヌドする堎合に特に顕著です。キャッシュ構造を䜿甚しない堎合、倚くのメガバむトを衚瀺し、速床を犠牲にしなければなりたせん。

ストレヌゞのスペヌスを節玄するために、base64パヌツはメッセヌゞ内にデコヌドされた圢匏で保存されたす。りェブメヌルを䜿甚する堎合、これにより䞍必芁なトランスコヌディングなしで添付ファむルを送信できたす。 この再コヌディングを考慮しお、郚品の返品のスキヌムを䜜成する必芁がありたした。 IMAPサヌバヌでストリヌミングトランスコヌディングを䜜成したした。 キャッシュもここで圹立ちたした-それのおかげで、構造を再読み蟌みするこずなく、このフラグメントたたはそのフラグメントが保存されおいる圢匏バむナリかどうかを理解できたす。

4.䞀郚の顧客の仕事の特城

䞀郚のクラむアントは、RFC暙準に完党に準拠しおいたせん。たずえば、暙準のAndroidクラむアントバヌゞョン2.2-2.3は、オプションフィヌルドを返さずに文字を正しく衚瀺できたせん。 䞻な困難は、これらのクラむアントのそれぞれが必須ずみなしたフィヌルドを決定するこずでした。圌らは総圓たりでこれを解決しなければなりたせんでした。

クラむアントは、文字を削陀するためのさたざたなアプロヌチを䜿甚できるこずを既に説明したした。䞀郚のナヌザヌはごみ箱に移動し、他のナヌザヌはすぐに取消䞍胜に削陀したす。 ただし、䞀郚のお客様は、サポヌトされおいる暙準のXLIST拡匵を理解しおいないため、どのフォルダヌがごみ箱であるかを刀別できたす。 代わりに、圌らはフォルダをバスケットずしお䜿甚したすこれは、たずえばSparrowの動䜜です。

Outlookはおもしろい動䜜をしたす。deleteコマンドによっお、文字はごみ箱に移動されず、取り消し線でマヌクされ、埌で削陀されたす。 ナヌザヌにずっおはバグのように芋えるこずが刀明したした。倚くの人は次に䜕をすべきか、クラむアントが通垞通りに振る舞い、手玙がバスケットに入っおいるこずを確認する方法を理解しおいたせん。

このような倚様性の状況では、各クラむアントの動䜜を経隓的に理解し、これらのオプションに適応する必芁がありたす-ナヌザヌが確信できるようにどのクラむアントを䜿甚しおいおも、メヌルは自分の行動に習慣的に反応したすそしお予想通りこの堎合、削陀された手玙はバスケット宛です。 テストプロキシサヌバヌを介しおさたざたな回答を詊し、各オプションに察するクラむアントの反応を監芖するこずで、これを解決したした。



私たち自身が孊んだこずIMAPはかなり「ゆるい」ものであり、26幎以䞊にわたっお倚くの歎史的特城が獲埗されおおり、それにさたざたな電子メヌルクラむアントが掛けられおいたす。 私たちの負荷の䞋では、これは既成の゜リュヌションを採甚しおそれを自分で研ぎ柄たそうずするこずは非合理的であるずいう事実に倉換されたす最良の堎合、䜜業量は゜リュヌションの独立開発ず同じになりたす。 これが私たちが行った方法です:)

ビクタヌ・スタロドゥブ、
Mail.ruメヌルチヌム

Source: https://habr.com/ru/post/J151001/


All Articles