在可扩展的网站上显示实时数据?

时间:2018-02-24 09:19:11

标签: amazon-web-services websocket aws-lambda scalability azure-functions

我正在开始一个项目,我想创建一个显示实时航班信息和状态的网站。我们都在机场见过这个。这里给出一个例子 - http://www.computronics.biz/productimages/prodairport4.jpg。您可以看到此信息持续变化。该网站将与后端api通信,此后端api将与数据库对话。现在重要的是,数据库中的航班信息将由航空公司自行更新。可能有几家航空公司,他们将分别更新他们的数据。我已经绘制了一个图表并上传到此处 - https://imgur.com/a/ssw1S

现在这些航空公司显然会有一个界面(网站与一些后端API通信),他们将通过这个界面更新数据库。

现在我试图解决它。我们需要有某种触发器,如果​​任何航空公司在当前时间 - 1小时到当前+4小时(网站只显示几个小时的航班)之间更新数据库中的航班详情,我们需要调用web api和然后实时将更新发送到网站。 用户一定不能刷新页面。同时网站需要很好地扩展,即如果网站上有100万用户,并且数据库中的更新在正确的时间范围内所有100万用户的网站都应该在相当长的时间内得到更新。

我做了一些研究,看起来我们需要采用基于事件的方法。例如 - 我们需要创建一个函数(AWS lambda或Azure函数),只要在正确的时间范围内数据库(例如Dynamo DB)中有更新,就应该调用该函数。然后,此函数应调用API,然后应通过Web套接字技术更新网站。

我不是在寻找任何代码,只是关于如何以可扩展的方式解决这个问题的一些替代建议。另外我们如何测试可扩展性?

2 个答案:

答案 0 :(得分:4)

不要使用无服务器功能(Lambda / Azure功能)

虽然我是无服务器功能的忠实粉丝,并且目前在Lambda中运行完整的Web应用程序,但我认为它不需要用于您的用例,并且在经济上没有意义。正如您在评论中所回答的那样,每家航空公司都不会直接写入数据库,他们会推送到API,这意味着您在航班变更时会被明确告知。当航空公司向您发送新数据时,您只需通过websockets将其传播到所有浏览器端点即可。这使设计非常简单。没有必要人工创建数据库事件,然后触发一个函数,然后告诉您航班已更新。这就像移除门铃并用触发门铃的运动探测器替换它一样:)

<强>费用

金钱总是值得拥有自己的部分。 Lambda更像是经济突破而非技术突破。你必须知道它的成本效益。你支付每个请求,所以如果你处理一个月处理10,000次操作的过程,或者每天只发生1000次的事情,那么lambda很便宜且实际上是免费的。您还需要支付函数执行的时间长度以及执行时消耗的内存。通常,使用lambda函数是有意义的,其中专用服务器大多数时间都处于空闲状态。因此AWS不是一个完整的EC2实例,而是按需为您提供容器。有一些点,高请求率和不断运行的进程使lambda比EC2更昂贵。本文讨论了使用lambda达到一定程度的便宜程度 - &gt; https://www.trek10.com/blog/lambda-cost/这同样适用于Azure功能和谷歌等效。它们都只是按需提供的容器。

如果您正在处理航班信息,我会想象您每分钟都会有数千个航班更新,因此您的lambda功能将持续发射,就好像您正在运行EC2实例一样。你最终会比EC2付出更多。如果您的服务需要全天候运行并且每周7天每天24小时运行高活动,这对于专用服务器或服务器来说肯定是一个有效的用例。

提议的解决方案

以下是我将使用的组件:

  • 某种消息队列(也许是带有SNS的RabbitMQ或AWS SQS)
  • Web Socket后端(选择将取决于编程语言)
  • 航空公司输入API(REST,GraphQL或AWS Kinesis Data Firehose)

enter image description here

航空公司将其数据发布到后端api。更新存储在消息队列中,Web应用程序通过websockets实际向用户显示结果,从队列中读取。

<强>可扩展性

对于可伸缩性,您可以在自动扩展组中的多个EC2实例(所有读取来自相同的排队服务)上运行websocket应用程序,因此在额外加载时将自动创建更多实例,因此名称&#34; autoscaling&#34; 。这些情况可以位于弹性负载平衡器后面。关于如何执行此操作及其旗舰设计模式的大量AWS文档。如果您使用AWS SQS,则不必自己管理可伸缩性细节,aws会处理这些问题。唯一可扩展的组件是websocket应用程序和飞行数据输入端点。您也可以在自动扩展组中运行flight api,但AWS确实为高流量数据处理提供了额外的工具。我在下面详述。

测试可伸缩性

让一个模拟航空公司用成千上万的虚假更新来推动您的服务是相当容易的,另一方面,您可以轻松地运行多个硒测试线程,模拟浏览器点击并验证用户界面仍在运行。< / p>

其他工具

如果它最终是大量数据,而不是使用传统的REST API作为您的航班更新服务,您可以考虑AWS专门为处理大量实时更新而提供的服务(Kinessis Data Firehose){{3但是我从未使用它。

答案 1 :(得分:1)

首先,请不要过度思考。这是一个需要解决的微不足道的问题,不需要任何特殊技术,技术或时尚模式。框架。

您实际上有三个功能区域,几乎可以单独解决。

  1. 摄取 - 从各种来源收集和规范化数据。为此,您需要一个流程和转换引擎,LogicApps等。
  2. 您的数据库。你很快就会知道并非所有的航班都是一样的;)。虽然看起来似乎如此,但数据量并非 。针对特定功能调整的MySQL / SQL Server实例将正常工作。提示,您不需要为每个准备好一直呈现的动作提供数据。
  3. 演示。数据API和UI。这真的很容易。我建议你先使用基本的民意调查。由于您永远无法控制的原因,航班数据的SLA约为5分钟,因此实时客户通知系统是您应该首先在其他地方消费的时间。