使用AWS DynamoDB实现持久性的Python分布式锁管理器
dynamo-dlm的Python项目详细描述
发电机dlm
使用AWS DynamoDB实现持久性的Python分布式锁管理器
目前,这个模块公开了一个分布式锁定原语DynamoDbLock
,其功能与标准库中的threading.Lock
类似
锁的作用域是逻辑资源,由一个任意但唯一标识的字符串表示,下面称为resource_id
。
具有相同表名和资源id的DynamoDbLock
的所有实例都将遵守锁规则。
默认情况下,锁查找名为dynamo_dlm_locks
的DynamoDB表。
您可以使用下面概述的表的自定义名称。
表必须有一个名为String
类型的主键,并且没有排序键:
您的应用程序需要以下权限才能正常工作:
关于容量和性能的说明:
lock类的设计使得它在正常情况下永远不会失败。
如果有足够的时间,它最终应该获得一个锁,即使同时有数千个请求。
使用按需容量时,所有锁每次都应在固定时间内获取。
DynamoDB提供的容量是一个非常深入的话题,但如果您正在使用它并遇到锁获取时间过长的问题,那么您可能需要增加写容量。
锁应该从不消耗读取容量。这是由于DynamoDB处理条件写入的方式造成的。
日志记录已添加到日志级别WARNING
以通知您与已调配容量相关的任何退避。
当不受写容量或网络速度的限制时,在AWS之外运行时,平均获取/释放周期大约需要100ms。
如果您的执行环境在AWS中,则速度会明显加快,在同一区域内,执行速度可低至10毫秒。在
安装和使用
通过pip安装:
pip install dynamo-dlm
使用锁原语非常简单。
只需创建一个具有唯一标识符的实例并调用acquire()
。
这将阻止任何其他实例对acquire()
的调用,直到调用release()
或锁过期,以先到者为准。
完成锁定所需的资源后,请调用release()
放弃对锁的控制。
请记住:具有相同标识符和表名的所有实例都将使用相同的锁。
理想情况下,您希望将过期时间定为比预期操作所需时间稍长的时间。
锁只能以整秒的增量操作,因此最短的合理锁定时间为1秒。
在开发过程中,请密切关注WARNING
记录器,以了解锁即将过期的迹象,这意味着操作花费的时间比预期的要长。在
importdynamo_dlmasdlmresource_id='a unique resource identifier'lock=dlm.DynamoDbLock(resource_id)lock.acquire()# Code executed here is protected by the lock until it expireslock.release()
lock类也作为上下文管理器实现:
^{pr2}$默认情况下,如果不释放,锁将持续10秒。 可以在模块级别全局设置持续时间和/或表名:
importdynamo_dlmasdlmdlm.DEFAULT_DURATION=5dlm.DEFAULT_TABLE_NAME='my_dynamo_db_lock_table'resource_id='a unique resource identifier'lock=dlm.DynamoDbLock(resource_id)
它们也可以被每个锁覆盖:
importdynamo_dlmasdlmresource_id='a unique resource identifier'lock=dlm.DynamoDbLock(resource_id,duration=5,table_name='my_dynamo_db_lock_table')
- 项目
标签: