您好,欢迎来到爱站旅游。
搜索
您的当前位置:首页(转)使用异步Python3.6和Redis编写快速应用程序

(转)使用异步Python3.6和Redis编写快速应用程序

来源:爱站旅游
(转)使⽤异步Python3.6和Redis编写快速应⽤程序

转⾃:http://mp.weixin.qq.com/s?

__biz=MjM5NzU0MzU0Nw==&mid=2651374524&idx=1&sn=d2aa7aa484d048b9e63a56ff8a&chksm=bd2408a88a5381bea9f8376ecb96f5aab056d2dc203142df10a42b238b695e42928256b

⼈们对于Python和其他解释型语⾔(例如:Ruby,JavaScript,PHP,Perl等等),最常抱怨的就是他们太慢了。显然,⽹络应⽤中,速度更快的语⾔能够实现更短的响应时间以及降低服务器的消耗。

为了解决这样的问题,Python3.4引⼊了asyncio模块,随后,Python3.5则为它设计了新的语法。然后,随之⽽来的uvloop⽹络库为asyncio带来了速度上的极⼤提升:

uvloop使得asyncio相当快。实际上,和nodejs,gevent以及任何其他Python中的异步⽹络架构相⽐,asyncio的速度⾄少是它们的2倍,基于uvloop的asyncio在性能上的表现已经接近于Go语⾔了。

在Paxos(译者注:⼀种基于消息传递的⼀致性算法)中,我们⼤量使⽤asyncio,既是因为它的性能更好,也是因为asyncio更加适合我们整体架构。我们的产品与来⾃不同的客户端的事务数据同步,同时,因为它是⼀个分布式系统,所以本质上讲,它⼜是异步的。

asyncio能够出⾊地将吞吐量最⼤化,但是我们也关⼼要减少延迟。就延迟⽽⾔,你的数据库本⾝会是⼀个主要的瓶颈。实践中,当我们使⽤例如合适的索引,或者固态磁盘这些最佳⽅法时,⼀个⼤约10ms响应时间的数据库查询被认为是效果不错的。

当然,RAM要⽐asyncio要快⼏个数量级,但是简单的\"key-value\"型的存储结构,并不能实现软件⼯程师们所常常依赖的许多特性。⽐如,多索引和基本类型检测是⾮常有⽤的,也最好能有像\"ORDER BY\",\"LIMIT\"和\"OFFSET\"这些功能。

此外,Redis的性能、⾼级特性及其⽂档,已经给我们留下了⾮常深刻的印象。所以我们写了⼀个可被Redis⽀持的对象映射器:\"\",它依赖于asyncio和Redis的强⼤原语。使得你能以RAM的性能利⽤数据库,这就像是⼀个SQLAlchemy的精简版(不⽀持\"JOIN\"操作)。

译者注:Redis:⼀个key-value存储系统

译者注:SQLAlchemy:Python编程语⾔下的⼀款开源软件。提供了SQL⼯具包及“对象关系映射”⼯具,使⽤MIT许可证发⾏。你可以如下定义⼀个模型(更多细节请查阅 official repo):

然后,你可以查询和使⽤你的这个模型:

你也会找到很多你期望在传统的ORM中有的功能。下⾯是如何向⼀个满⾜属性:{US, college-age, male}的⽤户发⼀个推送的过程:

译者注:ORM:对象关系映射

为了证明在实际中这个⼯具(subconscious)是多么强⼤和⽅便使⽤,我们把⼀个类似Pastebin的⽹站和⼤约100⾏代码放在了⼀起。

⽹站URL:http://52.170.82.45/

源代码:https://github.com/paxos-bankchain/pastey

我们⽤Microsoft Azure中最廉价的应⽤实例(称作F1,拥有1核处理器以及2GB的RAM)上加载和测试了这个APP,结果数据是很漂亮的:

⼤约41秒内发送了10000次页⾯请求页⾯响应时间的中位数⼤约是19毫秒⼤约22毫秒内,90%的页⾯做出了服务响应

Redis可以保存在磁盘上,但是对⽐传统的数据库,它的持久性更弱。同时,它的事务和回滚很复杂,⽽且对于及数据完整性,⼏乎没什么保证。⼀些常见的⽤例如下:

可以从⽇志中重播的临时数据(所以持久性不是⼤问题)频繁更新的数据:写⼊RAM⽐写⼊磁盘要快得多当延迟是⾮常重要的考虑因素时

当相同的数据被定期查询,同时数据的容量很低,以及/或者你有很充⾜的硬件预算时

对于低吞吐量的应⽤或者适⽤于⽔平缩放的应⽤来说,这些特性可能⽆法提供让⼈兴奋的充⾜的优势。但是对于⾼吞吐量的应⽤来说,延迟对它们有着不可忽略的影响,那么,这种性能的提升就存在着重⼤的价值。

Subconscious是使⽤MIT许可证发⾏的开源⼯具,所以你可以⾃由地在你⾃⼰的项⽬中使⽤它。

英⽂原⽂:https://eng.paxos.com/write-fast-apps-using-async-python-3.6-and-redis 译者:guoziqing

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- azee.cn 版权所有 赣ICP备2024042794号-5

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务