设计亚马逊按销售排名功能

这篇具有很好参考价值的文章主要介绍了设计亚马逊按销售排名功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1: 定义 Use Cases 和 约束

Use cases

作用域内的Use Case
  • Service 通过目录计算过去一周内最受欢迎的产品
  • User 通过目录去View过去周内最受欢迎的产品
  • Service 有高可用
作用域外
  • 整个电商网站
    • 设计组件(只是计算销售排名)

约束和假设

  • Traffic 不是平均分布的
  • 类目会被存进多个不同目录
  • 类目不能改变目录
  • 没有子目录,比如: foo/bar/baz
  • 结果会被定时更新
    • 更受换一个的产品或许需要更频繁的更新
  • 1000 万产品
  • 1000 目录
  • 10 亿交易 / 月
  • 1000 亿 请求 / 月
  • 100:1读写比率

计算使用量

  1. 每个 trasnaction 的 Size

    • created_at - 5 bytes
    • product_id - 8 bytes
    • category_id - 4 bytes
    • seller_id - 8 bytes
    • buyer_id - 8 bytes
    • quantity - 4 bytes
    • total_price - 5 bytes
    • Total: ~40 bytes
  2. 每个月有 40 GB 的新 trasnaction 内容

  • 40 字节 / transaction * 10 亿 transaction / 月
  • 1.44 TB 新 transaction 内容 / 3 年
  • 假设大部分是新的交易,而不是更新已经存在的
  1. 平均 400 transaction / s
  2. 平均 40000 读请求 / s

便利转换指南:

  • 每个月有250万秒
  • 1 request / s = 250 万 请求 / 月
  • 40 request / s = 1 亿请求每月
  • 400 request / s = 10 亿请求每月

2:创建一个High Level设计

设计亚马逊按销售排名功能,服务器,设计模式

3: 设计核心组件

Use case: Service 通过category计算过去周内最受欢迎的产品

我们可以我们可以存储二进制 Sales API server的 log 文件进受管理的独享存储,比如 Amazon S3, 而不是管理我们自己的分布式文件系统

我们将假设这是一个简单的 log entry, tab delimited:

timestamp   product_id  category_id    qty     total_price   seller_id    buyer_id
t1          product1    category1      2       20.00         1            1
t2          product1    category2      2       20.00         2            2
t2          product1    category2      1       10.00         2            3
t3          product2    category1      3        7.00         3            4
t4          product3    category2      7        2.00         4            5
t5          product4    category1      1        5.00         5            6

Sales Rank Service 会使用 MapReduce, 使用这个 Sales API Sever的 log 文件作为输入,而且结果会被写进聚合表 sales_rank. 我们应该讨论数据库是选用SQL 还是NoSQL.

我们将使用多步骤的 MapReduce:

  • Step1: 转移数据到 `(category, produce_id), sum(quantity)
  • Step2: 执行分布式排序
class SalesRanker(MRJob):

    def within_past_week(self, timestamp):
        """Return True if timestamp is within past week, False otherwise."""
        ...

    def mapper(self, _ line):
        """Parse each log line, extract and transform relevant lines.

        Emit key value pairs of the form:

        (category1, product1), 2
        (category2, product1), 2
        (category2, product1), 1
        (category1, product2), 3
        (category2, product3), 7
        (category1, product4), 1
        """
        timestamp, product_id, category_id, quantity, total_price, seller_id, \
            buyer_id = line.split('\t')
        if self.within_past_week(timestamp):
            yield (category_id, product_id), quantity

    def reducer(self, key, value):
        """Sum values for each key.

        (category1, product1), 2
        (category2, product1), 3
        (category1, product2), 3
        (category2, product3), 7
        (category1, product4), 1
        """
        yield key, sum(values)

    def mapper_sort(self, key, value):
        """Construct key to ensure proper sorting.

        Transform key and value to the form:

        (category1, 2), product1
        (category2, 3), product1
        (category1, 3), product2
        (category2, 7), product3
        (category1, 1), product4

        The shuffle/sort step of MapReduce will then do a
        distributed sort on the keys, resulting in:

        (category1, 1), product4
        (category1, 2), product1
        (category1, 3), product2
        (category2, 3), product1
        (category2, 7), product3
        """
        category_id, product_id = key
        quantity = value
        yield (category_id, quantity), product_id

    def reducer_identity(self, key, value):
        yield key, value

    def steps(self):
        """Run the map and reduce steps."""
        return [
            self.mr(mapper=self.mapper,
                    reducer=self.reducer),
            self.mr(mapper=self.mapper_sort,
                    reducer=self.reducer_identity),
        ]

这个结果将变成下面的 sorted list, 我们可以插入 sales_rank 表中:

(category1, 1), product4
(category1, 2), product1
(category1, 3), product2
(category2, 3), product1
(category2, 7), product3

sales_rank table 会有如下的结构:

id int NOT NULL AUTO_INCREMENT
category_id int NOT NULL
total_sold int NOT NULL
product_id int NOT NULL
PRIMARY KEY(id)
FOREIGN KEY(category_id) REFERENCES Categories(id)
FOREIGN KEY(product_id) REFERENCES Products(id)

我们将创建一个index在id, category_id, and product_id 上去加速查询(log 时间而不是扫描整张表)
,而且放进数据去内存。从内存中序列化的读取数据需要250微妙,当从SSD读取需要4倍,从磁盘读取需要80倍。

Use Case: User 通过目录查看过去一周内最受欢迎的产品
  • Client 发送请求到Web Server
  • Web Server 转发请求到 Read API server
  • Read API server 从数据库表 sales_rank 重读取数据

我们可以使用如下Rest API:

$ curl https://amazon.com/api/v1/popular?category_id=1234

Response:

{
    "id": "100",
    "category_id": "1234",
    "total_sold": "100000",
    "product_id": "50",
},
{
    "id": "53",
    "category_id": "1234",
    "total_sold": "90000",
    "product_id": "200",
},
{
    "id": "75",
    "category_id": "1234",
    "total_sold": "80000",
    "product_id": "3",
}

4: 扩展设计

设计亚马逊按销售排名功能,服务器,设计模式

分析数据库可以使用数据仓库解决方案,如Amazon Redshift或Google BigQuery。

我们可能只想在数据库中存储有限时间段的数据,而将剩余数据存储在数据仓库或对象存储中。像亚马逊S3这样的对象存储可以轻松应对每月40 GB新内容的限制。

为了解决每秒 40,000 个平均读取请求(峰值更高),流行内容(及其销售排名)的流量应由内存缓存而不是数据库处理。内存缓存对于处理分布不均的流量和流量尖峰也很有效。由于读取量很大,SQL 读取副本可能无法处理缓存缺失。我们可能需要采用额外的 SQL 扩展模式。

对于单个SQL写主从架构来说,每秒400次平均写入(峰值更高)可能很困难,这也表明需要额外的扩展技术。文章来源地址https://www.toymoban.com/news/detail-817136.html

到了这里,关于设计亚马逊按销售排名功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 亚马逊AWS上怎么创建Linux 服务器?操作难不难?

    AWS(Amazon Web Services)是全球领先的云服务器提供商之一。你可以使用 AWS 平台在一分钟内设置完服务器。在 AWS 上,你可以微调服务器的许多技术细节,如 CPU 数量,内存和磁盘空间,磁盘类型(更快的 SSD 或者经典的 IDE)等。关于 AWS ***的一点是,你只需要为你使用到的服务付费。

    2024年04月16日
    浏览(23)
  • 亚马逊云服务器aws ssh无法登录的解决问题记录

    一、涉及命令 二、AWS亚马逊云EC2服务器使用Root登录方法(在debian系统上操作成功) 三、SSH密钥丢失,更换密钥方法 解决连接到 EC2 实例时的“服务器拒绝我们的密钥”错误 四、可疑方法 1、将具有 SSH 访问权限的新用户账户添加到 Amazon EC2 Linux 实例 2、使用 EC2 串行控制台

    2024年02月06日
    浏览(21)
  • 领取的AWS亚马逊云服务器到期会扣费的问题解决办法。

    本篇文章主要讲解,领取的AWS亚马逊服务器到期后会持续扣费问题的解决办法。 作者:任聪聪 日期:2023年6月8日 关于aws服务器一年免费期限到期后扣费的问题,网络上的文章并不是很全,故此我通过个人的经验进行了如下的教程整理。 我将通过一些比较常见的问题对大家一

    2024年02月08日
    浏览(32)
  • 【免费外国云服务器】亚马逊AWS创建EC2实例搭建个人服务器

    作者:20岁爱吃必胜客(坤制作人),近十年开发经验, 跨域学习者,目前于海外某世界知名高校就读计算机相关专业。 荣誉: 阿里云博客专家认证 、腾讯开发者社区优质创作者,在CTF省赛校赛多次取得好成绩。 跨领域学习 ,喜欢摄影、弹吉他、咏春拳。 文章深入浅出、语

    2024年02月04日
    浏览(25)
  • ​ 云计算的尽头是轻量应用服务器?带你了解亚马逊Lightsail的卓越优势

    很多小伙伴可能都在好奇,轻量应用服务器有什么特点?为什么相较于普通的云服务器,很多用户现在都更青睐于轻量应用服务器?这个“轻”就是它独特的优势所在。轻量应用服务器以其“开箱即用、应用优质、轻松上手、投入划算、运维便捷和稳定可靠”等特点,成为了中

    2024年04月27日
    浏览(23)
  • 一站式解决方案:体验亚马逊轻量服务器/VPS的顶级服务与灵活性

    文章目录 一、什么是轻量级服务器/VPS 二、服务器创建步骤 三、服务器连接客户端(私钥登录) 四、使用服务器搭建博客网站 五、个人浅解及总结 一、什么是轻量级服务器/VPS 亚马逊推出的轻量级服务器/VPS :是一种基于云计算技术的虚拟服务器解决方案。它允许用户在云端创

    2024年02月05日
    浏览(28)
  • 使用亚马逊(AWS)云服务在S3上实现图片缩放功能(CloudFront/S3[AccessPoint/LambdaAccessPoint])

    亚马逊云服务中的S3对象存储功能和国内阿里云的oss对象存储使用基本一致。但是涉及到存储内容处理时,两家有些差别。 比如:对于云存储中的图片资源,阿里云比较人性化对于基本的缩放裁剪功能已经帮我们封装好了,只需要在url地址后面拼接参数即可,但是亚马逊S3存

    2024年02月16日
    浏览(21)
  • 运营干货!亚马逊运营每天工作清单,如何保证亚马逊账号安全?

    对于刚踏入亚马逊跨境电商领域的运营新手,常常会感到困惑和担忧,怕运营效果不理想。别担心,今天就带着大家一起了解亚马逊运营每天的工作内容,还有大家都很担心的亚马逊账号安全问题,我也会为大家逐一解开谜团,下面这份详尽的清单宝典都为各位列明白了,建

    2024年01月21日
    浏览(26)
  • 突破亚马逊智能检测,全自动化运营的新利器:亚马逊鲲鹏系统

    在亚马逊运营的道路上一般最为棘手的问题之一就是账号关联和安全性。而亚马逊鲲鹏系统它不仅拥有最新的防指纹技术,还能够完全模拟真实的人类行为,让每个账号都拥有独立环境运行,从而保证账号的安全性,让用户摆脱了账号关联的困扰。 1、IP方面的独特技术 亚马

    2024年02月22日
    浏览(27)
  • 亚马逊账户评级多久更新一次,亚马逊账户评级一般多少分-站斧浏览器

    亚马逊账户评级多久更新一次? 亚马逊的账户评级通常每天都会更新一次。这意味着您的账户的表现和健康状况将每天进行评估和更新。评级通常在UTC时间午夜更新,但具体的更新时间可能因地区而异。 亚马逊的账户评级反映了您作为卖家的表现和账户健康状况。它涵盖了

    2024年02月07日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包