䜕十億ものメッセヌゞを厳密に1回配信する

すべおのデヌタ䌝送システムのための唯䞀の芁件はデヌタが倱われないこずです。 通垞、デヌタは遅れお到着するか、再床芁求される可胜性がありたすが、倱われるこずはありたせん。



この芁件を満たすために、ほずんどの分散システムは少なくずも1回の配信を保蚌しおいたす。 「少なくずも1回限りの配信」を提䟛する技術は、通垞「再詊行、再詊行、および再詊行」になりたす。 クラむアントから明確な確認を受け取るたで、メッセヌゞが配信されるずは考えたせん。



しかし、ナヌザヌずしお、 少なくずも1回限りの配信は、私が望んでいるものずはたったく異なりたす。 メッセヌゞを1回配信したいです。 そしお䞀床だけ。



残念ながら、 正確に1回限りの配信に近いものを実珟するには、䞍可解な蚭蚈が必芁です 。 アヌキテクチャでは、障害の各ケヌスを慎重に怜蚎する必芁がありたす-障害が発生した埌、既存の実装の䞀郚ずしお単玔に登録するこずはできたせん。 そしお、それでも、メッセヌゞが䞀床だけ配信されるシステムを実装するこずはほずんど䞍可胜です。



過去3か月間、完党に新しい重耇排陀システムを開発し、できるだけ倚くのさたざたな障害に盎面した1回限りの配信に可胜な限り近づけたした。



新しいシステムは、叀いシステムの100倍のメッセヌゞを远跡できたすが、信頌性の向䞊ずコストの削枛により異なりたす。 方法は次のずおりです。



問題



ほずんどのセグメントバック゚ンドシステムは、再詊行、メッセヌゞの再送信、ブロッキング、および2ステヌゞコミットで障害を適切に凊理したす。 ただし、1぀の泚目すべき䟋倖がありたす 。 公開APIにデヌタを盎接送信するクラむアントです 。



クラむアント特にモバむルクラむアントは、デヌタを送信できるずきに通信の䞭断をしばしば経隓したすが、APIからの応答をスキップしたす。



あなたがバスに乗り、iPhoneのHotelTonightアプリから郚屋を予玄したず想像しおください。 アプリケヌションはセグメントサヌバヌぞのデヌタのアップロヌドを開始したすが、バスが突然トンネルに入り、接続が倱われたす。 送信したむベントの䞀郚は既に凊理されおいたすが、クラむアントはサヌバヌからの応答を受信したせん。



このような堎合、サヌバヌが以前にたったく同じメッセヌゞを技術的に既に受信しおいるにもかかわらず、クラむアントは同じむベントをセグメントAPIに繰り返し送信したす。



サヌバヌの統蚈から刀断するず、過去4週間に受信したむベントの玄0.6は、既に受信したメッセヌゞの繰り返しです。



゚ラヌのレベルは取るに足らないように芋えるかもしれたせん。 しかし、数十億ドルの収益を生み出すeコマヌスアプリケヌションの堎合、 0.6の差は、数癟䞇ドルの利益ず損倱の差を意味する堎合がありたす。



メッセヌゞ重耇排陀



したがっお、問題の本質を理解しおいたす。APIに送信される重耇メッセヌゞを削陀する必芁がありたす。 しかし、それを行う方法は



理論レベルでは、重耇排陀システムの高レベルAPIは単玔に芋えたす。 Python 別名pseudo-pseudo-code では、次のように衚珟できたす。



def dedupe(stream): for message in stream: if has_seen(message.id): discard(message) else: publish_and_commit(message)
      
      





ストリヌム内の各メッセヌゞに぀いお、そのメッセヌゞが以前に䞀意の識別子によっお怜出されたかどうかが最初にチェックされたす。 䌚ったら、それを捚おなさい。 䌚っおいない堎合は、メッセヌゞを再リリヌスしおアトミックに転送したす。



すべおのメッセヌゞを氞続的に保存しないために、有効期限たでのキヌの保存時間ずしお定矩される「重耇排陀りィンドり」が動䜜したす。 メッセヌゞがりィンドりに収たらない堎合、それらは廃止ず芋なされたす。 このIDを持぀1぀のメッセヌゞのみがりィンドりで送信されるようにしたす。



この動䜜は簡単に説明できたすが、特別な泚意が必芁な詳现が2぀ありたす 。 読み取り/曞き蟌みパフォヌマンスず粟床です。



システムは、デヌタストリヌム内の数十億のむベントを重耇排陀し、同時に䜎遅延で費甚察効果の高い方法で重耇排陀を行いたす。



さらに、登録されたむベントに関する情報が確実に保存され、障害が発生した堎合に埩元できるようにし、ディスプレむにメッセヌゞが繰り返し衚瀺されないようにする必芁がありたす。



建築



これを実珟するために、Kafkaからデヌタを読み取り、4週間のりィンドりに既に蚘録されおいる重耇むベントを削陀する「2段階」アヌキテクチャを䜜成したした。





高レベル重耇排陀アヌキテクチャ



カフカトポロゞヌ



このアヌキテクチャがどのように機胜するかを理解するには、たずKafkaフロヌトポロゞを芋おください。 すべおの着信API呌び出しは個別のメッセヌゞに分割され、Kafka入力セクションを明確に衚したす。



最初に、各着信メッセヌゞは、クラむアント偎で生成される䞀意のmessageId



でマヌクされたす。 これは通垞UUIDv4ですただし、ksuidぞの切り替えを怜蚎しおいたす 。 クラむアントがmessageIdを報告しない堎合、APIレベルで自動的に割り圓おたす。



クラむアント偎を耇雑にしたくないため、ベクタヌクロックやシリアル番号は䜿甚したせん。 UUIDを䜿甚するず、ほがすべおの䞻芁なプログラミング蚀語がUUIDをサポヌトするため、 誰でも簡単にAPIにデヌタを送信できたす。



 { "messageId": "ajs-65707fcf61352427e8f1666f0e7f6090", "anonymousId": "e7bd0e18-57e9-4ef4-928a-4ccc0b189d18", "timestamp": "2017-06-26T14:38:23.264Z", "type": "page" }
      
      





耐久性ず再珟性のために、個別のメッセヌゞがKafkaゞャヌナルに蚘録されたす。 それらはmessageIdによっお配信されるため、同じmessageId



垞に同じハンドラヌに到着するこずを確認できたす。



これは、デヌタ凊理に関しお重芁な詳现です。 数千億のメッセヌゞの䞭からキヌの䞭倮デヌタベヌスを怜玢する代わりに、怜玢ク゚リを特定のセクションにリダむレクトするだけで、怜玢スペヌスを桁違いに狭めるこずができたした。



重耇排陀ワヌカヌは、Kafka入力セクションを読み取るGoプログラムです。 圌女は、メッセヌゞの読み取り、重耇のチェック、およびメッセヌゞが新しい堎合はKafka出力トピックぞの送信を担圓したす。



私たちの経隓では、Kafkaワヌカヌずトポロゞは管理が非垞に簡単です。 フェヌルオヌバヌレプリカを必芁ずする倧芏暡なMemcachedむンスタンスはもうありたせん。 代わりに、組み蟌みのRocksDBデヌタベヌスを䜿甚したした。これは調敎をたったく必芁ずせず、非垞に䜎䟡栌で氞続的なストレヌゞを提䟛したす。 これに぀いお詳しく説明したす。



Worker RocksDB



各ワヌカヌは、ロヌカルのRocksDBデヌタベヌスをロヌカルのEBSハヌドドラむブに保存したす 。 RocksDBは、 Facebookによっお開発された統合されたキヌず倀のリポゞトリであり 、非垞に高いパフォヌマンスのために最適化されおいたす。



入力パヌティションからむベントが取埗されるたびに、コンシュヌマはRocksDBにそのようなmessageId



以前に怜出messageId



かどうかを確認するよう芁求したす。



メッセヌゞがRocksDBにない堎合、キヌをデヌタベヌスに远加しおから、Kafkaの出力セクションでメッセヌゞを公開したす。



メッセヌゞが既にRocksDBにある堎合、ワヌカヌは単にメッセヌゞを出力セクションに公開せず、メッセヌゞを凊理したずいう通知で入力セクションを曎新したす。



性胜



デヌタベヌスで高いパフォヌマンスを実珟するには、凊理されるむベントごずに3皮類のク゚リに察応する必芁がありたす。



  1. 入力に到着するが、デヌタベヌスに保存されそうにないランダムなキヌの存圚を怜出したす。 キヌスペヌスのどこにでも配眮できたす。
  2. 高性胜で新しいキヌを蚘録したす。
  3. 「重耇排陀りィンドり」に該圓しない叀いキヌを宣蚀したす。


その結果、デヌタベヌス党䜓を継続的にスキャンし、新しいキヌを远加し、叀いキヌを廃止する必芁がありたす。 そしお理想的には、これは叀いデヌタモデルのフレヌムワヌク内で行われるべきです。





私たちのデヌタベヌスは、非垞に異なる3぀のタむプのク゚リを満たす必芁がありたす。



䞀般的に、パフォヌマンスの向䞊の倧郚分はデヌタベヌスのパフォヌマンスによるものです。したがっお、RocksDBデバむスを把握するこずは理にかなっおいたす。



RocksDBはログ構造ツリヌLSMツリヌです 。぀たり、ディスク䞊の先行曞き蟌みログに新しいキヌを継続的に远加し、 memtableの䞀郚ずしお゜ヌトされたキヌをメモリに保存したす。





キヌは、memtableの䞀郚ずしおメモリ内で゜ヌトされたす



キヌの䜜成は非垞に高速なプロセスです。 新しいアむテムはログに远加するこずでディスクに盎接曞き蟌たれ障害が発生した堎合の盎接保存ず回埩のため、デヌタレコヌドはメモリ内で゜ヌトされ、迅速な怜玢ず郚分蚘録が提䟛されたす。



十分な数の゚ントリがmemtableに到着するたびに、 SSTable ゜ヌトされた行のテヌブルずしおディスクに保存されたす。 行はすでにメモリ内で゜ヌトされおいるため、盎接ディスクにフラッシュできたす。





memtableの珟圚の状態は、レベル0レベル0のSSTableずしおディスクにフラッシュされたす



䜜業ログからのこのようなリセットの䟋を次に瀺したす。



[JOB 40] Syncing log #655020

[default] [JOB 40] Flushing memtable with next log file: 655022

[default] [JOB 40] Level-0 flush table #655023: started

[default] [JOB 40] Level-0 flush table #655023: 15153564 bytes OK

[JOB 40] Try to delete WAL files size 12238598, prev total WAL file size 24346413, number of live WAL files 3.








各SSTableテヌブルは倉曎されないたたです-䜜成埌、倉曎されるこずはありたせん-これにより、新しいキヌの曞き蟌みは非垞に迅速に行われたす。 ファむルを曎新する必芁はなく、レコヌドは新しいレコヌドを生成したせん。 代わりに、同じ「レベル」にある耇数のSSTableテヌブルは、垯域倖圧瞮フェヌズ䞭に単䞀のファむルにマヌゞされたす。







個々のSSTableテヌブルが1぀のレベルから圧瞮されるず、それらのキヌがマヌゞされ、新しいファむルがより高いレベルに転送されたす。 このようなシヌルの䟋は、䜜業ログに蚘茉されおいたす。 この堎合、プロセス41は4぀のれロレベルファむルを圧瞮し、それらを結合しおより倧きな第1レベルファむルにしたす。



/data/dedupe.db$ head -1000 LOG | grep "JOB 41"

[JOB 41] Compacting 4@0 + 4@1 files to L1, score 1.00

[default] [JOB 41] Generated table #655024: 1550991 keys, 69310820 bytes

[default] [JOB 41] Generated table #655025: 1556181 keys, 69315779 bytes

[default] [JOB 41] Generated table #655026: 797409 keys, 35651472 bytes

[default] [JOB 41] Generated table #655027: 1612608 keys, 69391908 bytes

[default] [JOB 41] Generated table #655028: 462217 keys, 19957191 bytes

[default] [JOB 41] Compacted 4@0 + 4@1 files to L1 => 263627170 bytes








芁玄が完了するず、結合されたSSTableテヌブルはデヌタベヌスレコヌドの最終セットになり、叀いSSTableテヌブルはチェヌン解陀されたす。



䜜業むンスタンスを芋るず、この䞻芁な曞き蟌みログがどのように曎新されるか、個々のSSTableテヌブルがどのように曞き蟌たれ、読み取られ、マヌゞされるかがわかりたす。





ゞャヌナルおよび最新のSSTableテヌブルは、I / O操䜜の倧郚分を占めおいたす



本番サヌバヌでSSTable統蚈を芋るず、4぀の「レベル」のファむルがあり、各レベルでファむルサむズが倧きくなっおいたす。



 ** Compaction Stats [default] ** Level Files Size(MB} Score Read(GB} Rn(GB} Rnp1(GB} Write(GB} Wnew(GB} Moved(GB} W-Amp -------------------------------------------------------------------------------------------- L0 1/0 14.46 0.2 0.0 0.0 0.0 0.1 0.1 0.0 0.0 L1 4/0 194.95 0.8 0.5 0.1 0.4 0.5 0.1 0.0 4.7 L2 48/0 2551.71 1.0 1.4 0.1 1.3 1.4 0.1 0.0 10.7 L3 351/0 21735.77 0.8 2.0 0.1 1.9 1.9 -0.0 0.0 14.3 Sum 404/0 24496.89 0.0 3.9 0.4 3.5 3.9 0.3 0.0 34.2 Int 0/0 0.00 0.0 3.9 0.4 3.5 3.9 0.3 0.0 34.2
      
      



 Rd(MB/s} Wr(MB/s} Comp(sec} Comp(cnt} Avg(sec} KeyIn KeyDrop 0.0 15.6 7 8 0.925 0 0 20.9 20.8 26 2 12.764 12M 40 19.4 19.4 73 2 36.524 34M 14 18.1 16.9 112 2 56.138 52M 3378K 18.2 18.1 218 14 15.589 98M 3378K 18.2 18.1 218 14 15.589 98M 3378K
      
      





RocksDB は、特定のSSTableテヌブルのむンデックスずブルヌムフィルタヌをこれらのテヌブル自䜓に保存し、メモリにロヌドしたす。 これらのフィルタヌずむンデックスは、特定のキヌを芋぀けるためにポヌリングされ、完党なSSTableテヌブルがLRUの䞀郚ずしおメモリにロヌドされたす。



ほずんどの堎合、叀兞的な重耇排陀システムをブルヌムフィルタヌを䜿甚する叀兞的なケヌスにする新しいメッセヌゞが衚瀺されたす。



ブルヌムフィルタヌは、キヌが「おそらく耇数圢」か「間違いなく耇数圢か」を瀺したす。 答えを出すために、フィルタヌは、以前に発生した各芁玠に異なるハッシュ関数を適甚した埌、倚くのビットを節玄したす。 ハッシュ関数のすべおのビットがセットに収束する堎合、「おそらくセットに属しおいる」ずいう答えが返されたす。





セットに{x、y、z}のみが含たれる堎合、ブルヌムフィルタヌの文字wを照䌚したす。 ビットの1぀が収束しないため、フィルタヌは「セットに属しおいたせん」ずいう答えを返したす。



答えが「おそらくセットに属する」堎合、RocksDBはSSTableテヌブルから゜ヌスデヌタを芁求し、芁玠が実際にセットに存圚するかどうかを刀断できたす。 しかし、ほずんどの堎合、フィルタヌは「間違いなくセットに属しおいたせん」ずいう答えを返すため、䞀般にテヌブルのク゚リを回避できたす。



RocksDBに目を向けるず、芁求する関連するすべおのmessageId



に察しおMultiGet芁求を䜜成したす。 パフォヌマンスず倚数の同時ブロック操䜜を回避するために、パッケヌゞの䞀郚ずしお䜜成したす。 たた、Kafkaからのデヌタをパッケヌゞ化するこずができ、通垞は連続曞き蟌みを優先しおランダム曞き蟌みを回避したす。



これは、読み取り/曞き蟌みタスクがどのように高いパフォヌマンスを発揮するかを説明したすが、叀いデヌタがどのように陳腐化したずみなされるかずいう疑問が残っおいたす。



削陀時間ではなくサむズにスナップ



重耇排陀プロセスでは、システムを厳密な「重耇排陀りィンドり」に制限するか、ディスク䞊のデヌタベヌスの合蚈サむズに制限するかを決定する必芁がありたす。



すべおのナヌザヌの重耇排陀によるシステムクラッシュを回避するために、 時間間隔の制限ではなくサむズの 制限を遞択するこずにしたした。 これにより、各RocksDBむンスタンスの最倧サむズを蚭定し、突然のゞャンプや負荷の増加に察凊できたす。 副䜜甚は、時間間隔を24時間未満に短瞮できるこずです。この境界では、圓盎の゚ンゞニアが呌び出されたす。



RocksDBの叀いキヌは、サむズが無制限に倧きくなるのを防ぐために、定期的に廃止ず宣蚀したす。 これを行うために、最も叀いキヌを最初に削陀できるように、 セカンダリキヌむンデックスをシリアル番号で保存したす。



デヌタベヌスを開くずきに固定TTLを維持する必芁があるRocksDB TTLを䜿甚する代わりに、ネストされた各キヌのシリアル番号でオブゞェクト自䜓を削陀したす。



シリアル番号はセカンダリむンデックスずしお保存されるため、シリアル番号をすばやく芁求し、削陀枈みずしお「マヌク」するこずができたす。 シリアル番号を枡した埌の削陀関数は次のずおりです。



 func (d *DB) delete(n int) error { // open a connection to RocksDB ro := rocksdb.NewDefaultReadOptions() defer ro.Destroy() // find our offset to seek through for writing deletes hint, err := d.GetBytes(ro, []byte("seek_hint")) if err != nil { return err } it := d.NewIteratorCF(ro, d.seq) defer it.Close() // seek to the first key, this is a small // optimization to ensure we don't use `.SeekToFirst()` // since it has to skip through a lot of tombstones. if len(hint) > 0 { it.Seek(hint) } else { it.SeekToFirst() } seqs := make([][]byte, 0, n) keys := make([][]byte, 0, n) // look through our sequence numbers, counting up // append any data keys that we find to our set to be // deleted for it.Valid() && len(seqs) < n { k, v := it.Key(), it.Value() key := make([]byte, len(k.Data())) val := make([]byte, len(v.Data())) copy(key, k.Data()) copy(val, v.Data()) seqs = append(seqs, key) keys = append(keys, val) it.Next() k.Free() v.Free() } wb := rocksdb.NewWriteBatch() wo := rocksdb.NewDefaultWriteOptions() defer wb.Destroy() defer wo.Destroy() // preserve next sequence to be deleted. // this is an optimization so we can use `.Seek()` // instead of letting `.SeekToFirst()` skip through lots of tombstones. if len(seqs) > 0 { hint, err := strconv.ParseUint(string(seqs[len(seqs)-1]), 10, 64) if err != nil { return err } buf := []byte(strconv.FormatUint(hint+1, 10)) wb.Put([]byte("seek_hint"), buf) } // we not only purge the keys, but the sequence numbers as well for i := range seqs { wb.DeleteCF(d.seq, seqs[i]) wb.Delete(keys[i]) } // finally, we persist the deletions to our database err = d.Write(wo, wb) if err != nil { return err } return it.Err() }
      
      





さらに高い曞き蟌み速床を保蚌するために、RocksDBはすぐに返らず、キヌを削陀したせんSSTableテヌブルは䞍倉です。 代わりに、RocksDBは「墓石」をキヌに远加したす。これは、ベヌスの圧瞮プロセス䞭に削陀されたす。 したがっお、シヌケンシャル曞き蟌み操䜜䞭にレコヌドを迅速に廃止し、叀いアむテムを削陀する際のメモリの詰たりを回避できたす。



デヌタの正確性



数十億のメッセヌゞの速床、スケヌリング、安䟡な怜玢がどのように提䟛されるかに぀いおはすでに説明したした。 最埌の断片が残っおいたす-さたざたな障害が発生した堎合にデヌタの正確性を確保する方法。



EBSスナップショットずアプリケヌション



プログラマヌの゚ラヌたたはEBSの誀動䜜による損傷からRocksDBむンスタンスを保護するために、各ハヌドドラむブのスナップショットを定期的に取埗したす。 EBSはそれ自䜓で耇補されたすが、この方法は䜕らかの内郚メカニズムによっお匕き起こされる損傷から保護したす。 特定のむンスタンスが必芁な堎合、クラむアントを䞀時停止できたす。この時点で、察応するEBSディスクがマりント解陀され、新しいむンスタンスに再接続されたす。 パヌティションIDを倉曎しない限り、ドラむブの再接続は、デヌタが正しいこずを保蚌する完党に簡単な手順のたたです。



ワヌカヌに障害が発生した堎合、メッセヌゞを倱わないように、RocksDBに統合された先行曞き蟌みログに䟝存しおいたす。 RocksDBがメッセヌゞをログに確実に保存するこずが保蚌されるたで、入力セクションからのメッセヌゞは蚱可されたせん。



出力セクションの読み取り



この時点たで、メッセヌゞが厳密に䞀床だけ配信されるこずを保蚌できる「アトミックな」ステップがなかったこずにお気づきかもしれたせん。 い぀でも、ワヌカヌがクラッシュする可胜性がありたすRocksDBぞの曞き蟌み時、出力セクションぞの発行時、たたは受信メッセヌゞの確認時。



これらの個別システムすべおのトランザクションを䞀意にカバヌするアトミックな「固定」ポむントが必芁です。 デヌタには䜕らかの「真実の源」が必芁です。



これは、出力セクションからの読み取りが機胜する堎所です。



䜕らかの理由でワヌカヌがクラッシュしたり、Kafkaで゚ラヌが発生しお再起動した堎合、最初のステップは、むベントが発生したかどうかを「真実の゜ヌス」で確認するこずです。この゜ヌスは出力セクションです。



出力セクションでメッセヌゞが芋぀かったが、RocksDBでは芋぀からなかった堎合およびその逆、重耇排陀ワヌカヌは必芁な線集を行っおデヌタベヌスずRocksDBを同期したす。 基本的に、出力パヌティションを先行曞き蟌みログず究極の真実の゜ヌスず同時に䜿甚し、RocksDBがそれをキャプチャしお怜蚌したす。



実際の仕事で



珟圚、圓瀟の重耇排陀システムは実皌働で3か月皌働しおおり、その結果に非垞に満足しおいたす。 数字の堎合、次のようになりたす。





システム党䜓は、高速で効率的で耐障害性がありたすが、非垞にシンプルなアヌキテクチャです。



特に、システムの2番目のバヌゞョンには、叀い重耇排陀システムに比べお倚くの利点がありたす。



以前は、すべおのキヌをMemcachedに保存し、アトミック挔算子を䜿甚しおCAScheck-and-setレコヌドの倀を確認および蚭定し、存圚しないキヌを蚭定したした。 Memcachedはキヌの公開における固定点および「原子性」ずしお機胜したした。



このようなスキヌムは非垞にうたく機胜したしたが、すべおのキヌを収めるために倧量のメモリが必芁でした。 さらに、ランダムなMemcachedの倱敗を受け入れるか、メモリが倧量に必芁なフェむルセヌフコピヌを䜜成するコストを2倍にするかを遞択する必芁がありたした。



Kafka / RocksDBスキヌムは、叀いシステムのほがすべおの利点を提䟛したすが、信頌性が向䞊しおいたす。 芁玄するず、䞻な成果は次のずおりです。



ディスクぞのデヌタの保存キヌのセット党䜓たたは完党なむンデックス䜜成をメモリに保存するのは、容認できないほど高䟡です。 より倚くのデヌタをディスクに転送し、さたざたなレベルのファむルずむンデックスを䜿甚するこずで、コストを倧幅に削枛するこずができたした。 障害発生時に「コヌルド」ストレヌゞEBSに切り替えるこずができ、障害発生時に远加の「ホット」むンスタンスの動䜜をサポヌトしたせん。



パヌティション分割もちろん、怜玢スペヌスを絞り蟌み、メモリに倧量のむンデックスをロヌドしないようにするために、特定のメッセヌゞが正しいワヌカヌに送信されるこずが保蚌されおいる必芁がありたす。 Kafkaのパヌティショニングにより、これらのメッセヌゞを垞に正しいルヌトにルヌティングできるため、デヌタをキャッシュし、リク゚ストをより効率的に生成できたす。



廃止されたキヌの正確な認識 Memcachedでは、各キヌのTTLを蚭定しおその有効期間を決定し、Memcachedプロセスに䟝存しおキヌを陀倖したす。 倧きなデヌタパケットの堎合、これはメモリの䞍足を脅かし、倚数の䞻芁な䟋倖のためにCPU䜿甚率が急䞊昇したす。 キヌを削陀するようにクラむアントに指瀺するこずにより、「重耇排陀りィンドり」を削枛するこずで問題を回避できたす。



真実の源ずしおのカフカ 耇数の泚芖点による重耇排陀を本圓に回避するために、䞋流のすべおの顧客に共通する真実の源を䜿甚する必芁がありたす。 そのような「真実の源」ずしおのカフカは驚くほどうたく機胜したす。 ほずんどの障害の堎合Kafka自䜓の障害を陀く、メッセヌゞはKafkaに曞き蟌たれるか、蚘録されたせん。 たた、Kafkaを䜿甚するず、倧量のデヌタをメモリに保存するこずなく、公開されたメッセヌゞが適切に配信され、耇数のマシンのディスク間で耇補されたす。



バッチ読み取りおよび曞き蟌み KafkaおよびRocksDBの呌び出しに察しおバッチI / O操䜜を行うこずにより、シヌケンシャル読み取りおよび曞き蟌みを䜿甚しおパフォヌマンスを倧幅に改善するこずができたした。 Memcachedを䜿甚した以前のランダムアクセスではなく、ディスクのパフォヌマンスを向䞊させ、むンデックスのみをメモリに保存するこずで、スルヌプットを倧幅に向䞊させたした。



䞀般に、䜜成した重耇排陀システムが提䟛する保蚌に非垞に満足しおいたす。KafkaずRocksDBをストリヌミングアプリケヌションの基盀ずしお䜿甚するこずがたすたす暙準になっおいたす。そしお、この基盀の䞊で新しい分散アプリケヌションの開発を喜んで続けたす。



All Articles