This repository was archived by the owner on Apr 12, 2023. It is now read-only.
-
Couldn't load subscription status.
- Fork 107
This repository was archived by the owner on Apr 12, 2023. It is now read-only.
ETag による通信量削減 #199
Copy link
Copy link
Open
Labels
Description
その機能リクエストは何らかの問題に関連しますか / Is your feature request related to a problem?
- 接触確認毎に毎回TEKリストを DLし、無駄な通信量が多い問題。
- CDN サーバーは ETag を付与しているが、有効活用していない問題。
なお接触確認が走る頻度はバックグラウンド (6 時間毎) あるいは, 手動によるホームページ再表示毎です. URL は https://covid19radar-jpn-prod.azureedge.net/c19r/440/list.json です. zip に比べれば対した通信量ではないと思いますが、電源消費も抑えられるかもしれません。
解決策についてお書きください / Describe the solution you'd like
- ETag を利用し通信量を削減する
現在は、 TEK リストは毎回 DL し、 LastProcessTekTimestamp より新しい TEK(zip) をDL して接触確認し、成功すれば LastProcessTekTimestamp を更新しています。 以下では、サーバーが付与する ETag をローカルに保存して、 ETag が違えば DL する通信(If-None-Match)を行う実装案を紹介します。重要なのは、 LastProcessTekTimestamp と同じタイミングで ローカル ETag を更新することです。もし、 接触確認失敗のときに、 ローカル ETag だけ更新すると TEK リストが DL されなくなり、 ETag がサーバー側で更新されるまで(現状では1日)接触確認できなくなります。それを考慮した実装案が以下です。
- ETag 利用のため, HttpDataService.cs (GetCdnAsync) を改変します. ETagの一時的なやり取りは Xamarin.Essentials.PreferenceKey を用います。
- ETag 保存のため, LastProcessTekTimestamp と同じ枠組みを使います。対応のため改変するのは2ファイルです
-- PreferenceKey.cs (PreferenceKey.ETag追加)
-- ExposureNotificationService.cs (Get&Set method追加。及び RemoveLastProcessTekTimestamp の中で ETag も 消去し再DL可能に) - ETag 更新のため, ExposureNotificationHandler.cs を改変します
あなたが考える代替案についてご説明ください / Describe alternatives you've considered
- (今後サーバー側の ETag 不対応等がある場合など) Last-Modified と If-Modified-Since を使う.
1日様子を見た範囲(Android)では、ETag は機能していそうです(以下のスクショ)。もう少し様子を見ます。
- ETag の一時的なやり取りをXamarin.Essentials.PreferenceKey 以外を使う
アドバイスあれば。
その他 / Additional context
- (参考)ETag とは? https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/ETag
- 同じことは、 TermsUpdateService.cs, https://covid19radarjpnprod.z11.web.core.windows.net/ja/terms_update.json でも可能と予想しています。ただし、この issue が採用の場合にはむしろ、 ETag 更新された時だけ TermsUpdateService を呼ぶという仕組みを作るのがベターと考えています。
Internal Tracking Code: NFR 2527
