リソースコストを削減するためにデータを最適化した経験を共有したいと思います。
遅かれ早かれ、システムは、特にデータがRAMに保存されている場合、保存されたデータを最適化するという問題を提起します。このようなデータベースの例はRedisです。
一時的な解決策として、RAMを増やして時間を稼ぐことができます。
RedisはSQLを使用しないデータベースであり、組み込みコマンドredis-cli --bigkeysを使用してプロファイルを作成できます。このデータベースには、キーの数と各キーの平均使用量が表示されます。
ソートされたセットタイプの履歴データは大きなデータであることが判明しました。彼らはアプリから10日間ローテーションしました。
プロジェクトは本番環境にあるため、最適化によってユーザーに影響が及ぶことはありません。
データは、オファーの価格/納期変更のイベントを表しています。たくさんのオファーがありました-各フィード(価格表)で約15,000。
オファーのイベントデータの次の例について考えてみます。
{"EventName":"DELIVERY_CHANGED","DateTime":"2021-02-22T00:04:00.112593982+03:00","OfferId":"109703","OfferFrom":{"Id":"109703","Name":" LG SN11R","Url":"https://www.example.ru/saundbar-lg-sn11r/?utm_source=yandex_market&utm_medium=cpc&utm_content=948&utm_campaign=3&utm_term=109703","Price":99990,"DeliveryAvailable":true,"DeliveryCost":0,"DeliveryDate":"2021-02-24T23:49:00+03:00"},"OfferTo":{"Id":"109703","Name":" LG SN11R","Url":"https://www.example.ru/saundbar-lg-sn11r/?utm_source=yandex_market&utm_medium=cpc&utm_content=948&utm_campaign=3&utm_term=109703","Price":99990,"DeliveryAvailable":true,"DeliveryCost":0,"DeliveryDate":"2021-02-23T00:04:00.112593982+03:00"}}
このイベントは706バイトかかります。
最適化
まず、使用されたのは最後の週だったので、ローテーションを7日に短縮しました。ここで注目に値するのは、この手順が非常に簡単で(ソースコードで10から7に変更した場合)、RAMサイズがすぐに30%削減されることです。
, , , name, url, offerId 50%.
C:
{"EventName":"DELIVERY_CHANGED","DateTime":"2021-02-22T00:04:00.112593982+03:00","OfferId":"109703","OfferFrom":{"Price":99990,"DeliveryAvailable":true,"DeliveryCost":0,"DeliveryDate":"2021-02-24T23:49:00+03:00"},"OfferTo":{"Price":99990,"DeliveryAvailable":true,"DeliveryCost":0,"DeliveryDate":"2021-02-23T00:04:00.112593982+03:00"}}
334 .
json protobuf.
, protobuf proto - :
syntax = "proto3"; import "google/protobuf/timestamp.proto"; message OfferEvent { enum EventType { PRICE_CHANGED = 0; DELIVERY_CHANGED = 1; DELIVERY_SWITCHED = 2; APPEARED = 3; DISAPPEARED = 4; } EventType event_name = 1; google.protobuf.Timestamp date_time = 2; string offer_id = 3; message Offer { int32 price = 1; bool delivery_available = 2; int32 delivery_cost = 3; google.protobuf.Timestamp delivery_date = 4; } Offer offer_from = 4; Offer offer_to = 5; }
protobuf
event_name: DELIVERY_CHANGED date_time { seconds: 1613941440 } offer_id: "109703" offer_from { price: 99990 delivery_available: true delivery_date { seconds: 1614199740 } } offer_to { price: 99990 delivery_available: true delivery_date { seconds: 1614027840 } }
protobuf
echo ' event_name: DELIVERY_CHANGED date_time { seconds: 1613941440 } offer_id: "109703" offer_from { price: 99990 delivery_available: true delivery_date { seconds: 1614199740 } } offer_to { price: 99990 delivery_available: true delivery_date { seconds: 1614027840 } } ' | protoc --encode=OfferEvent offerevent.proto | xxd -p | tr -d "\n" 0801120608c095cb81061a06313039373033220e08968d061001220608bcf7da81062a0e08968d061001220608c0b8d08106
50 . 85%.
proto- - https://protogen.marcgravell.com/
, 14 (50 706 ), 93%.