我想使用php和mysql技术实现一个API,每秒可处理数千个请求。
我之前没有做过这种API。如果您有经验丰富的人来执行类似的任务,请告诉我有哪些步骤?
如何实现每秒可处理数千个请求的API?
如果您能用样本代码解释,我会很高兴。
提前感谢您的帮助。
答案 0 :(得分:2)
答案很好,我认为要记住的一件事是瓶颈在哪里。很多时候,瓶颈不是API服务器本身,而是具有持久层的数据访问模式。
考虑如何访问您的数据。对于发布新项目,很多时候处理可以延迟并处理为原始请求的异步。例如,如果调整图像大小或发送电子邮件,您可以集成RabmitMQ或SQS来排队作业,以后可以由工作人员处理。队列在缓冲工作方面非常出色,因此如果服务器出现故障,那么就会将其排队等待一旦重新联机处理。
在查询方面,了解索引的工作原理以及数据的存储方式非常重要。有不同类型的索引,例如哈希表可以为您提供持续的访问时间,但您不能使用哈希表执行范围查询。最简单的方法是,如果您有可以存储在索引中的标识符查询的简单分散数据对象。如果您需要进行大量连接或聚合时数据更复杂,那么您可以查看存储在Redis或memcache之类的预计算值。
答案 1 :(得分:1)
你需要考虑几个因素,例如:
验证API。您的API应由经过授权和验证的有效用户调用
缓存API结果。您的API应该缓存API调用的结果。这将允许您的API更快地处理请求,并且它将能够每秒处理更多请求。 Memcache可用于缓存API调用的结果
API架构。与基于SOAP的API相比,RESTFul API具有更少的开销。基于SOAP的API可以更好地支持身份验证。它们的结构也比RESTFul API更好。
API文档。您的API应有详细记录,便于用户理解。
API范围。您的API应具有明确定义的范围。例如,它将作为公共API在互联网上使用,还是在企业内部网中用作私有API。
设备支持。在设计API时,您应该记住将使用API的设备。例如智能手机,桌面应用程序,基于浏览器的应用程序,服务器应用程序等
API输出格式。在设计API时,您应该记住输出的格式。例如,输出将包含用户界面相关数据或仅包含普通数据。一种流行的方法称为关注点分离(https://en.wikipedia.org/wiki/Separation_of_concerns)。例如,分离后端和前端逻辑。
速率限制和限制。您的API应实施速率限制和限制,以防止过度使用和滥用API。
API版本控制和向后兼容性。您的API应该仔细版本化。例如,如果您更新API,则新版API应支持旧版API客户端。在所有API客户端迁移到新版API之前,您的API应继续支持旧的API客户端。
API定价和监控。应监控API的使用情况,以便了解谁在使用您的API及其使用方式。您也可能向用户收取使用API的费用。
成功的指标。您还应确定用于衡量API成功与否的指标。例如,每秒API调用次数或API的监控收入。在确定API的成功时,也可以考虑开展研究,发表文章,开源代码,参与在线论坛等活动。
估算所涉及的费用。您还应该计算开发和部署API的成本。例如,您需要花多少时间来生成可用的API版本。 API花费了多少开发时间等。
更新您的API。您还应该决定更新API的频率。例如,应该多久添加一些新功能。您还应该记住API的向后兼容性,因此更新API不会对客户产生负面影响。
答案 2 :(得分:1)
根据文章中描述的详细信息,您可能希望使用异步,无状态的体系结构。因此,请求不会阻塞资源,并且可以轻松扩展(听起来总是比实际操作容易;)。
在不知道这些服务器将要连接什么其他服务的情况下(这肯定不会使事情变得更简单),我选择使用Elixir / Erlang作为编程语言,并使用Phoenix作为框架。
您将获得强大的功能语言,其中包含许多出色的内置功能/模块(例如,实时运行的mnesia,滚动/展开版本),并且扩展性很好(善于利用服务器的所有内核)。
如果您需要将对第二层服务器的请求排队,则AMQP客户端/服务器(例如RabbitMQ)可能是一个不错的选择(保留/存储对服务器的请求)。
如果它是无状态的,那很好,因为客户端会问一件事,服务器会响应一次并完成任务。如果由于客户端每秒请求更新而有很多请求,那么最好切换到有状态连接并使用WebSockets,以便服务器可以将更新推送回很多客户端并减少很多lot不休/尖叫。 / p>
所有这些文字均来自“高视角”。最后,这取决于您要提供哪种服务。这样可以缩小“合适的工具”的范围。我的建议是我认为相距不远的一种可能性(前面提到的Node.js也是有效的)。