云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

CDN_贵阳网站建设开发_返利

小七 141 0

企业数据库_如何租用_一键搭建云免流服务器

[rubyonrails是一个很好的web应用程序框架,可以让初创公司看到他们的想法快速发展为产品。正因为如此,Freshworks的大多数产品都是使用rubyonrails构建的。从初创企业过渡到scaleup意味着必须不断改进您的应用程序,以便它们能够扩展以跟上客户的增长。在这个全新的工程系列中,轨道刻度,我们将讨论我们在产品中使用的一些技术和模式,数据更新,以调整它们的性能并帮助它们扩大规模。]缓存是一种常用的软件优化技术,广泛应用于各种形式的软件开发中,无论是web、移动,甚至是桌面。缓存存储操作的结果以供以后使用。例如,如果您将来再次访问,您的web浏览器将使用缓存来更快地加载此博客,这是通过在浏览器内存中存储.js、.css和图像等静态资源来实现的。使用缓存的最常见原因是:1ttl(生存时间)-缓存在指定时间间隔后自动过期的数据2一致性——当从不同的进程读取数据时,数据总是相同的——多个应用服务器或后台进程是当今云计算第一架构的一个标准。这使得缓存可以刷新—由于ttl而经常失效和刷新—并且一致—因为它是唯一的真实来源。虽然缓存是一个功能强大的工具,自助建站开发,但它通常是一个独立的进程,运行在通过网络调用访问的另一个服务器上。缓存系统总是很快,但是网络调用会给整个响应时间增加瓶颈。由于多个进程在同一个网络上同时进行调用-在一个封闭的vpc设置中-缓存将需要随组件一起扩展才能跟上。记忆记忆化是一种特定类型的缓存模式,用作软件优化技术。它涉及到记住,或者换句话说,大淘客cms,在执行代码的机器的内存中缓存复杂操作的输出。"备忘录"的词根是"备忘录",意思是"被记住"记忆化的一个优点是将数据缓存在计算机的内存中,从而避免了网络延迟。但是你很少会发现记忆化、多进程一致性和过期时间一起使用。我们需要一个库,它可以记录昂贵的操作,比如对数据库的网络调用或像S3这样的文件存储。该库应该支持随时过期的记忆值,并且在我们的多进程无状态体系结构中也是一致的。在rubygems中查找"memoize"给了我们多种选择,比如memoize_ttl、persistent-memoize、memoize-method等——它们要么在一致性方面,如何学习大数据,要么在过期方面,或者两者都缺乏。有些增加了写入磁盘的瓶颈,这可能会增加IOPs和延迟。备忘录介绍memoize_-until。一个功能强大但简单的记忆库,它关注多进程环境中所有缓存系统的动态性质和一致性,并将它们带到记忆世界中。记忆直到一个预先确定的时间度量开始时才记忆(记住)值,可以是分钟、小时、天甚至一周。首先,安装gem:1234567gem安装memoize_until>irbirb:>需要'memoize\uuntil'irb:>备忘录直到小时(:默认){irb:>$redis.get("APP_CONFIGS")irb:>}irb:>#记录(直到一天结束)并返回#PerformSomeComplexOperation的结果或者简单地把它添加到你的Gemfile中1他们"回忆"到公共API为库支持的每个时间间隔定义方法。在Rails环境中,MemoizeUntil检查config/memoize中定义的YML文件_直到.yml并使用此集合初始化应用程序。这将成为一个单独的地方来跟踪每个间隔的所有预定义的记忆键(也称为"目的")。还支持运行时目的,并且可以通过"add_to"API进行扩展。store类负责核心的记忆逻辑。MemoizeUntil类在初始化期间为每个间隔创建并维护存储对象的工厂常量。这些对象用嵌套哈希初始化,每个目的都是唯一的一级键。调用时,MemoizeUntil通过具有相同名称的公共方法定义查找间隔的工厂常量,并对该存储对象调用fetch。fetch方法计算当前时刻(如果间隔是day,它只计算当前时刻作为今天的日期),并将该时刻用作嵌套哈希中的子键。如果为间隔指定了值,则返回该值。如果键不存在,则存储区将清除所有以前记为内存的数据,以避免内存膨胀,然后调用传递给方法的原始块,并将结果存储在给定时刻。MemoizeUntil还处理nil,即nil也被memorized。12345678irb(主):024:0>回忆录直到const_get(:TYPE_FACTORY)[:day]=>备忘录直到:商店:0x00007f8a61415be8@@商店={:flags_from_redis=>{18=>1},:默认=>{}},@_种类=:day>irb(主):025:0>备忘录直到今天(:default){nil}=>nil irb(main):026:0>回忆录直到const_get(:TYPE_FACTORY)[:day]=>备忘录直到:商店:0x00007f8a61415be8@@商店={:flags_from_redis=>{18=>1},:默认=>{18=>#}},@\u kind=:天>在预先指定的时间度量开始时自动获取数据可以保证进程之间的一致性。我们如何使用它我们把MemoizeUntil构建为一个通用库,并将其用作我们产品和平台服务的通用优化模式。它最常见的应用包括记忆配置,如垃圾邮件阈值、服务的API限制等。还有一些特定的用例,我们将在以后的博客文章中介绍其中一些。一个这样的用例是需要切换到动态调试日志记录。我们在生产中默认为信息级日志,以节省日志大小和将这些日志提供给第三方和内部服务以进行调试和度量的相关成本。与所有软件一样,我们的客户报告的问题只有在他们的环境和帐户中才能重现。为了调试这样的问题,我们经常需要调试日志,由于我们的产品应用程序中设置了默认的"info"日志级别,大数据分析网站,所以这些日志不可用。通常,这将需要一个生产部署来更改日志级别,然后另一个部署将恢复到旧级别。为了避免与部署依赖性的冲突,我们为我们的应用程序和后台工作人员编写了中间件,它检查redis密钥并在设置了该密钥时更改日志级别。应用中间件示例如下:123456789101011121314151617181920212223类中间件::CustomLoggingdef initialize(app)@app=append def call(env)如果调试日志记录?Rails.logger.level=Logger::DEBUGend@status,@headers,@response=@应用程序调用(环境)ensureRails.logger.level=Logger::信息ifRails.logger.debug?是否结束privatedef调试日志记录?备忘录直到小时(:调试日志记录){$redis.get("调试日志")}结束为了避免对每个web请求进行缓存调用,我们希望在本地内存中记住此设置,但也要经常检查缓存存储是否已更新。这似乎是使用MemoizeUntil的完美用例。缓存的数据需要刷新,但不是立即刷新。自述文件涵盖了其他用例,如如何为运行时键和值扩展MemoizeUntil等等。不是另一个缓存MemoizeUntil不是缓存存储的替代品,它只是一种优化技术,通过保证一致性来减少对缓存或数据库的网络调用。由于所有的东西都存储在内存中,远程服务器上的内存限制也需要考虑——不过,多亏了云技术,这并不像以前那么令人担忧了。另外,与真正的标准记忆库不同,memoize方法调用每个唯一的参数集,我们采取了一种稍微修改的方法。这些目的可以是应用程序级(预定义的目的)或租户级(运行时目的)。相关岗位快速破解,用最少的代码减轻数据库负载扩展Freshdesk web应用程序以实现高可用性