我开始一个项目,我想创建一个网站,将显示实时飞行信息和状态。我们都在机场见过这个。这里给出了一个例子-- http://www.computronics.biz/productimages/prodairport4.jpg。如您所见,不断地更改。该网站将与后端api对话,而这个后端api将与数据库对话。现在重要的是数据库中的飞行信息将由航空公司自己更新。可能有几家航空公司,他们将分别更新他们的数据。我已经画了一个图表并上传到这里- https://imgur.com/a/ssw1S。
现在,这些航空公司显然将有一个界面(与某个后端API对话的网站),通过它他们将更新数据库。
下面是我解决这个问题的尝试。我们需要某种类型的触发,如果任何航空公司在当前时间-1小时到当前+4小时之间更新数据库中的航班详细信息(网站只显示几个小时的航班),我们需要调用web,然后实时将更新发送到网站。用户不能刷新页面。同时需要很好地扩展--如果有100万用户在网站上,而且数据库中有正确的时间范围内的更新,则所有100万用户的网站都应该在相当长的时间内得到更新。
我做了一些研究,看起来我们需要一个基于事件的方法。例如,我们需要创建一个函数(AWS、lambda或Azure函数),只要数据库中有更新(例如,Dynamo),就应该在正确的时间范围内调用该函数。然后,这个函数应该调用一个API,然后通过website技术更新网站。
我并不是在寻找任何代码,而是一些关于如何以可伸缩的方式解决这个问题的替代建议。此外,我们如何测试可伸缩性?
发布于 2018-02-25 06:50:07
不使用无服务器函数(Lambda/Azure函数)
虽然我是无服务器功能的超级粉丝,目前在Lambda中运行一个完整的web应用程序,但我不认为这是你的用例所需要的,也没有经济上的意义。正如您在评论中所回答的那样,每一家航空公司都不会直接写到数据库,它们将推送到API,这意味着当航班更改时,您将被明确告知。当航空公司向您发送新数据时,您只需通过websockets将其传播到所有浏览器端点。这使得设计非常简单。没有必要人为地创建一个数据库事件,然后触发一个函数,该函数将告诉您已更新了一个航班。这就像移除你的门铃,用触发门铃的运动检测器来代替它:)
成本
钱总是值得它自己分的。兰博达与其说是技术上的突破,不如说是经济上的突破。你必须知道什么时候它的成本效益。您需要支付每个请求的费用,所以如果您处理一个每月处理10,000次操作的过程,或者比lambda每天只触发1,000次的操作,那么您的处理过程就非常便宜,而且实际上是免费的。您还需要支付函数执行的时间长度和执行过程中所消耗的内存。通常,使用lambda函数是有意义的,因为在这些函数中,专用服务器大部分时间都处于空闲状态。因此,AWS不是一个完整的EC2实例,而是按需提供一个容器。在某些点上,高请求率和不断运行的进程使得lambda比EC2更昂贵。本文讨论了在一定程度上使用lambda如何更便宜,-> https://www.trek10.com/blog/lambda-cost/也适用于Azure函数和googles等价物。它们都是按需提供的集装箱。
如果您正在处理航班信息,我可以想象,您将每分钟更新数千次航班,因此您的lambda函数将像运行EC2实例一样不断地启动。你最终会支付比EC2多得多的钱。如果您的服务需要24/7工作,并且运行24/7,活动频繁,这无疑是专用服务器或服务器的有效用例。
提出的解决方案
以下是我将使用的组件:
航空公司将数据发布到后端api。更新存储在消息队列中,web应用程序通过websockets将结果实际显示给用户,并从队列中读取。
可伸缩性
为了实现可伸缩性,您可以在自动标号组中的多个EC2实例上运行websocket应用程序(所有这些实例都是从同一个队列服务中读取的),因此,随着额外的负载,将自动创建更多的实例,因此名为“自动标注”。这些实例可以放在弹性负载平衡器后面。关于如何做到这一点和它的旗舰设计模式的许多AWS文档。如果您使用AWS,您不需要自己管理可伸缩性细节,aws就会处理这个问题。唯一真正要扩展的组件是websocket应用程序和飞行数据输入端点。您也可以在自动标度组中运行api,但是AWS确实为高流量数据处理提供了额外的工具。我在下面详述这一点。
测试可伸缩性
让一家模拟航空公司用成千上万的假更新来启动您的服务是相当容易的,另一方面,您可以轻松地运行多个selenium测试线程,模拟浏览器单击并验证UI是否仍然有效。
附加工具
如果它最终是大量的数据,而不是为您的航班更新服务使用传统的REST,您可以考虑AWS专门为处理大量实时更新而提供的服务(KinessisDataFire浩) https://aws.amazon.com/kinesis/data-firehose/,但我从未使用过它。
发布于 2018-02-24 05:39:01
首先,请不要想得太多。这是一个需要解决的小问题,不需要任何特殊的技术、技术或时髦的模式和框架。
实际上,您有三个功能区域,您几乎可以单独处理。
https://stackoverflow.com/questions/48961243
复制