Rust at Fairy Devices, Inc. 12-year of experience in developing distributed storage. (Erlang, Java) フリーランスのソフトウェアエンジニア。 フェアリーデバイセズ株式会社にてRustを使ったWebサービスの開発に携わっている。 12年間におよぶ分散ストレージの開発経験を持つ。(Erlang、Java) Tatsuya Kawano @tatsuya6502
New York, USA for 7 years. (Graphic design major at a school) Lives in Shanghai, China since 2013. 東京育ち。 ニューヨークに7年間在住。(⼤学でグラフィックデザインを専攻) 2013年より上海に在住。 Tatsuya Kawano @tatsuya6502
data retrieved from a slower media on a faster media. Many kinds: CPU caches (data, instructions), OS caches (pages), in-application in-memory cache, shared/distributed caching server… Moka cache is an in-memory cache. It is like a HashMap with a capacity limit. 低速のメディアから取得したデータの⼀部を、⾼速のメディアに保存するためのしくみ。 いろいろな種類がある:CPUキャッシュ、OSのページキャッシュ、アプリ内の インメモリキャッシュ、共有/分散キャッシングサーバー、など。 Mokaキャッシュはインメモリキャッシュの⼀種。容量制限付きのHashMapのようなもの。 Time and space trade-o ff to improve performance.
with REST API to get GitHub stars for given repository. Axum / Tokio Octocrab rust-lang / rust API $ curl ⭐ 86,200 rust-lang / rust ⭐ 86,200 Our Wed API Service
library for Java. 1,000+ GitHub stars. 840,000+ downloads in last 90 days. (Oct 2023) JavaのCa ff eineキャッシュライブラリーを参考にしている。 GitHubスターは1,000個以上。 過去90⽇間のダウンロード回数は84万回以上。 (2023年10⽉調べ) moka-rs / moka A fast and concurrent cache library for Rust iStock Licensed to @tatsuya6502
Sentry.io. Some people use it in home routers. (Arm, MIPS, etc.) MIT、および、Apache-2ライセンスの下、オープンソース。 Crates.ioやSentry.ioのバックエンドサービスで使⽤されている。 Ոఉ༻ϧʔλʔͰͬͯΔਓʢArmɺMIPSͳͲʣ Named after the moka pot, a stove-top co ff ee maker. Open sourced under MIT and Apache-2 licenses iStock Licensed to @tatsuya6502 moka-rs / moka
entries. LRUキューの⼿前にLFUフィルターを設置し、使⽤頻度の低いエントリーの⼊場を拒否する。 A LFU (Least Frequently Used) fi lter in front of the LRU queue. https://github.com/moka-rs/moka/wiki
to performance degradation. ロック競合が起こるとスレッドの稼働率が下がり、パフォーマンスの低下につながる。 Lock contentions T1 T2 T3 r t1 t3 t4 t5 t6 t7 t2 acquire the lock release the lock blocked
thread to apply their changes to the shared resource r, use a channel ch to store recordings of cache accesses, and only apply them together after a certain amount of items has accumulated. 各スレッドが共有リソース r に変更を適⽤する代わりに、チャネル ch を使ってキャッシュアクセスの 記録を保存し、ある程度、溜まってから⼀括して適⽤する。 T1 T2 T3 ch t1 t3 t4 t5 t6 t7 t2 send receive r update
that performs operations with using exclusive locks. Updates are made atomically using instructions such as Compare and Swap. 排他ロックを⽤いずに処理を⾏うデータ構造とアルゴリズム。 Compare and Swap処理などを⽤いてアトミックにデータ更新を⾏う。
is a fork of cht crate) cht and channel: lock-free → short, predictable latency other data structures: mutex with batch application → high throughputs Moka内部の並⾏ハッシュテーブルで採⽤されている(chtクレートのフォーク) chtとチャネル: ロックフリー → レイテンシ(応答時間)が短く、予測可能 他のデータ構造: mutexと⼀括適⽤ → ⾼スループット
lock implementations: traditional non-futures-aware locks, and futures-aware locks. Avoid to use traditional locks when: Acquiring the lock may take long time. → Will block the async executor. Or, hold the lock across an .await. → Can deadlock the async executor. ロック実装には、伝統的なfuture未対応ロックと、future対応ロックの2種類がある。 以下のような場合は、伝統的なロックの使⽤を避けるべき。 ロックの取得に時間がかかる。→ ⾮同期エクゼキュータをブロックしてしまう。 または、.awaitにまたがってロックを保持する。→ ⾮同期エクゼキュータがデッドロックする可能性がある。
not work in some cases. But it cannot spawn a Future as it has no dependency to any async runtime. Used future_util::future::Shared, and make drop method to save it to an unbound channel, so that it can retry later. Mokaでは後⽚付けではうまく処理できないケースがある。 しかし、⾮同期ランタイムに依存していないので、Futureをspawnできない。 future_util::future::Sharedを使い、dropメソッドでサイズ制限なしのチャネルに保存す る。あとでリトライする。