Zomato或Swiggy

  Ravinder Singh Sengar 5分钟阅读

  在这里,我们将尝试涵盖端到端的设计,以及技术选择和高层架构,以建立一个食品配送应用程序(可以扩展到创建一个电子商务应用程序)。我们将涵盖的主要功能需求是::

  1.登机时的餐厅。

  2.食物和菜单(由餐厅上传,由应用程序管理员批准)。

  3.3.动态定价(添加送货费用、折扣、促销活动等)。

  4.4.门到门交付(司机选择,订单的持续位置更新等

  5.用户注册、角色和安全

  6.基于用户活动、生成的订单、用户位置和正在进行的促销活动的搜索和推荐。

  7.通知(为每个事件通知客户)。

  8. 与支付网关集成。

  9. 评论、评级和调查。

  10. 订单处理,购物车和结账。

  11.客户支持和改进。

  12.可增强的设计,以支持B2C电子商务应用。

  13.销售报告

  14.账单和文件

  非功能方面

  1.系统可以支持超过百万的订单和x10的搜索请求。

  2.2.搜索的SLA应该是<500毫秒,并附有建议。

  3.3.交易数据无损失。

  设计决定和技术选择

  1.云平台:混合云。AWS和本地云(kubernetes),在AWS和on-prim数据中心之间直接连接。从AWS云中使用的云服务有SQS、SNS、AWS Lambda、AWS ADM、VPC等,以支持通知系统。详细介绍请参考通知应用程序。

  2.Kafka流:用于在订单管理的读写库之间实现高吞吐量的流式事件,向推荐引擎发送实时或批量事件,并将批准的目录和产品(菜单和食品)发布到弹性索引。

  3.RabbitMQ:实现分布式微服务之间的交易,并避免数据/交易损失。

  4.Apache Spark/Beam:用于运行map-reduce作业,以选择有效交付的驱动程序,并根据用户活动、订单活动、定价和促销变化等的连续流生成建议。

  5.Clickhouse数据库:所有处理过的数据都将存储在中间数据库中,它可以在高吞吐量(包括读和写)中提供良好的性能。Cassandra可能是一个选择,但由于它在从多个SS表读取数据时的低读取性能,在巨大的数据集的情况下,这不是一个有效的候选方案。Aerospike本来是第二选择,但由于这是处理过的数据,而且我们希望以关系形式存储这些数据以生成查询,所以我们就选择了它。

  6. Aero Spike DB : 支持实时读写的高吞吐量。

  7. Redis 缓存。存储城市中所有餐馆的位置和细分信息。由于这是非常频繁地读取和非变化的数据,我们选择将其设置在Redis中,以避免多次调用数据库。对于购物车,我们也将在Redis中存储所有选择的项目。

  8.ElasticSearch:ES索引用于存储所有发布的目录和产品,以及推荐的项目和下单查询,以实现搜索和浏览请求的目标服务水平。弹性搜索也将被用于索引客户呼叫记录和转录的元数据。

  9.PostgresDB:用于存储所有的外卖数据。我们选择了PostgresDB来支持本地云方法,但也可以考虑其他选项,如公共云管理的存储,以实现高扩展性。

  10.GraphQL:为了实现目标SLA,我们设计了系统,以支持不同的读写库,并使写库更符合领域数据,读库更符合将从用户界面请求的数据。为此,我们将所有与产品和订单相关的数据捆绑在各自的弹性索引中。现在,为了减少负载并只向用户界面发送相关的数据,我们使用了GraphQL查询语言来查询树中的部分数据,而不是完整的数据。推荐引擎也是如此。

  11.网络套接字:将用于向客户提供持续更新的司机位置,他已经选择了送货。

  12.REST API:除了上面指定的网络套接字和graphQL的情况,所有其他请求都是休息API。

  13.MongoDB:用于存储评论、评级、通知和调查相关的数据,这些数据没有固定的模式,而且会随时间变化。

  14.容器:Dockerized Spring Boot/Web Flux服务。

  15.云存储:用于Blob和文件存储的存储,如转录、文件、报告、模板等。

  16.NodeJS。暴露的轻量级API(s),以执行快速有效的IO操作,并支持可扩展的流量,并控制内存。Java Reactive/Spring Webflux也可以考虑作为替代方案。

  17.地图API:地图API将提供餐厅所在的城市信息和分段。同时,这也可以用来确定餐厅与顾客所在的地方之间的可能路线。

  18.配置服务器:用于属性/配置的外部化。

  19.19.API网关 : 暴露外部系统的代理API(s)。3个不同的API网关将以不同的安全级别和Rbac检查来暴露。

  20.Kubernetes(托管在公共云或原始系统上):Kubernetes集群将被部署在原始系统或公共云上,所有的容器服务将被托管在集群上。对于Infra,terraform是首选,以便在不同的云之间实现Infra服务和组件的相互移植。容器是基于docker的。

  21.服务网格:用于服务间通信、证书管理、服务发现、版本管理和速率限制(如果需要)。

  22.负载平衡器(网络和服务):网络负载平衡器将使用基于URL的路由到服务,服务负载平衡器将根据配置的模式(循环或基于负载)将网络流量重定向到部署的服务实例。

  23.网络防火墙:外部防火墙放置在API网关的顶部,以确保内部基础设施。

  24.活动目录:将存储所有的注册用户证书和RBAC来管理认证和授权。

  25.DevOps工具:Terraform(基础设施管理),Vault(密钥管理),Jenkins(CI/CD),Docker,Kubernetes,AWS,Datadog和Prometheus(监控和计量),ELK/Splunk(日志)。

  26.亚马逊Athena/Hive。用于查询存储在blob/云存储中的日志和转录。

  27.CDN:Akamai/亚马逊CDN用于静态内容和缓存

  28.规则引擎:用于配置定价和转录规则。

  关于将客户支持应用程序与该应用程序集成,请参考集中客户支持应用程序