Ruby on rails Rails ActiveSupport::CachingKeyGenerator上的内存使用问题
为了在数据库中加密和存储用户信息,我的Rails应用程序使用Ruby on rails Rails ActiveSupport::CachingKeyGenerator上的内存使用问题,ruby-on-rails,ruby,encryption,Ruby On Rails,Ruby,Encryption,为了在数据库中加密和存储用户信息,我的Rails应用程序使用salt(每个用户)使用ActiveSupport::KeyGenerator生成key。但是,generate_key方法执行的默认迭代是2**16[1]。在每次读取(用于解密)和写入(用于加密)时使用用户的salt执行密钥生成会降低我的应用程序的速度 我发现,如果用于生成密钥的salt和length保持不变,则可以使用ActiveSupport::CachingKeyGenerator来缓存密钥[2]。在内部,它使用Concurre
salt
(每个用户)使用ActiveSupport::KeyGenerator
生成key
。但是,generate_key
方法执行的默认迭代是2**16
[1]。在每次读取(用于解密)和写入(用于加密)时使用用户的salt
执行密钥生成会降低我的应用程序的速度
我发现,如果用于生成密钥的salt
和length
保持不变,则可以使用ActiveSupport::CachingKeyGenerator
来缓存密钥[2]。在内部,它使用Concurrent::Map
[3]来缓存密钥。使用ActiveSupport::CachingKeyGenerator
提高了我的应用程序的性能,因为它并不总是生成密钥
这是否会将我的应用程序的内存使用率提高到可以关闭应用程序的程度?
参考资料:
共享“有效”解决方案
由于ActiveSupport::CachingKeyGenerator
使用Concurrent::Map
,我发现缓存键将导致内存使用量增加,与用户数量成正比(前提是所有请求都以某种方式路由到同一节点)
为了解决这个问题,我编写了一个类似的CachingKeyGenerator
,它包装了ActiveSupport::KeyGenerator
和ActiveSupport::Cache::MemoryStore
class CachingKeyGenerator
BASE=Rails.application.secrets.secret\u key\u BASE
LENGTH=ActiveSupport::MessageEncryptor.key\u len
密钥到期日=1.5天
def初始化
@key\u generator=ActiveSupport::KeyGenerator.new(Rails.application.secrets.secret\u key\u base)
@keys\u cache=ActiveSupport::cache::MemoryStore.new(过期时间:KEY\u过期时间)
结束
def生成密钥(salt)
key=@keys\u cache.fetch(salt)
如果是key.nil?
key=@key\u生成器。生成密钥(salt,长度)
@密钥\缓存写入(salt,密钥)
结束
钥匙
结束
结束
根据Rails文档,ActiveSupport::Cache::MemoryStore
是线程安全的,并且实现了基于LRU的清理机制[1]。这将使缓存的内存使用具有确定性—为内存存储设置大小限制(默认值—32Mb,可在初始化期间定义)
附言:尚未在生产中部署,如果我遇到任何意外问题,将在这里更新
[1] 真的吗?你有多少用户?按键不会占用太多空间。我们有大约一百万用户。这要看情况而定。我建议在接近真实的数据量上使用内存分析,而不是依赖于论坛的意见:)也许,不缓存所有内容也是有意义的——用户的活动配置文件可能非常不同,并且(粗略地说)有20%的用户对您的基础设施造成80%的压力。仅缓存它们的密钥将通过合理的内存权衡减少性能问题。。。