高い同時実行nginxの+ LuaのOpenRestyシリーズ(10) - 商品の詳細ページ

この章でJingdongは、製品の詳細ページ、例えば、Jingdongは製品詳細ページ、単一ページのみが、ソースデータ集約は、AJAXを介してロードさ価格、在庫、サービスサポート非同期ロードなど、いくつかの比較的高いリアルタイム要件を除き、非常に多くのですが、 、バックエンドデータの他に、データ集約ページテンプレートに組み立てられます。

図に示すように、メインの製品ページには基本情報商品(基本情報、画像、カラー/サイズ関係、拡張属性、仕様書、パッキングリストのリスト、販売後の保護、など)、製品説明、追加情報(分類、ブランド、ショップを[含まれますサードパーティの販売者]、[サードパーティの販売店]分類、同様の関連ブランド)。詳細はここでは詳述されていません。


商品全体で数百万人のJingdongは何百、十分なコンテンツテンプレートアセンブリへのすべてのダイナミックアクセスは、性能要件を満たすことができないなど、多くのデータソースを引き起こすかのように、最初の溶液は、静的なページを生成することであるが、静的なページの最大の問題:1、すぐにはできませんページ応答要件が変更; 2は、より多くのオンライン比較テストバージョンを行うことは困難です。二つの要因として商品の多様化・ページの開発を制限するのに十分であるので、技術は非常に良いプログラムの静的ではありません。


基本情報製品のページ、製品の説明(非同期ロード)、追加の情報(分類、ブランド、ショップなど)、リアルタイムデータ表示(価格、在庫など)の他のニーズ:分析を通じて、データは4つのカテゴリに分類されています。このような分類などの他の情報は、ブランドショップが非常に小さいですが、あなたはRedisの店小さなメモリフットプリントを置くことができ、データのメリットがあるように私たちは、基本的な情報財にデータストレージの集約を行います静的な技術を学ぶことができます原子、テンプレートはページの静的なバージョンの欠点のために作らよりも多くの静的なページ集約の利点を吸収し、任意の時点での変数である一方で、彼らがハングアップまたは商品への応答が遅い場合は、別の非常に深刻な問題は、これらの関連システムに大きく依存していますページがハングアップまたは応答が遅く、(それがとき、ディスプレイ、ユーザが画面にマウスを移動する場合にのみ、2番目の画面であるため)、我々はまた、AJAX技術遅延ロードを通じて商品を紹介する;およびAJAX技術を経由して非同期読み込みを行うために、リアルタイムのデータを表示するので、私たちは、デザインは、次の操作を実行できます。

接收商品变更消息,做商品基本信息的聚合,即从多个数据源获取商品相关信息如图片列表、颜色尺码、规格参数、扩展属性等等,聚合为一个大的JSON数据做成数据闭环,以key-value存储;因为是闭环,即使依赖的系统挂了我们商品页还是能继续服务的,对商品页不会造成任何影响;
接收商品介绍变更消息,存储商品介绍信息;
介绍其他信息变更消息,存储其他信息。


整个架构如下图所示:

技术选型
MQ可以使用如Apache ActiveMQ;
Worker/动态服务可以通过如Java技术实现;
RPC可以选择如alibaba Dubbo;
KV持久化存储可以选择SSDB(如果使用SSD盘则可以选择SSDB+RocksDB引擎)或者ARDB(LMDB引擎版);
缓存使用Redis;
SSDB/Redis分片使用如Twemproxy,这样不管使用Java还是Nginx+Lua,它们都不关心分片逻辑;
前端模板拼装使用Nginx+Lua;
数据集群数据存储的机器可以采用RAID技术或者主从模式防止单点故障;
因为数据变更不频繁,可以考虑SSD替代机械硬盘

核心流程
首先我们监听商品数据变更消息;
接收到消息后,数据聚合Worker通过RPC调用相关系统获取所有要展示的数据,此处获取数据的来源可能非常多而且响应速度完全受制于这些系统,可能耗时几百毫秒甚至上秒的时间;
将数据聚合为JSON串存储到相关数据集群;
前端Nginx通过Lua获取相关集群的数据进行展示;商品页需要获取基本信息+其他信息进行模板拼装,即拼装模板仅需要两次调用(另外因为其他信息数据量少且对一致性要求不高,因此我们完全可以缓存到Nginx本地全局内存,这样可以减少远程调用提高性能);当页面滚动到商品介绍页面时异步调用商品介绍服务获取数据;
如果从聚合的SSDB集群/Redis中获取不到相关数据;则回源到动态服务通过RPC调用相关系统获取所有要展示的数据返回(此处可以做限流处理,因为如果大量请求过来的话可能导致服务雪崩,需要采取保护措施),此处的逻辑和数据聚合Worker完全一样;然后发送MQ通知数据变更,这样下次访问时就可以从聚合的SSDB集群/Redis中获取数据了。

おすすめ

転載: www.cnblogs.com/babycomeon/p/11109512.html