锁组件

锁组件

锁定组件创建和管理,一种提供对共享资源的独占访问的机制。

如果您正在使用Symfony框架,请阅读欧宝娱乐app下载地址欧宝娱乐app下载地址Symfony Framework Lock文欧宝体育电话档

安装

1
$作曲家需要Symfony / Lo欧宝娱乐app下载地址ck

笔记

如果在Symfony应用程序之外安装此组件,则必须要求欧宝娱乐app下载地址供应商/ autoload.php.以启用Composer提供的类自动加载机制。读本文更多细节。

用法

锁用于保证对某些共享资源的独占访问。例如,欧宝娱乐app下载地址在Symfony应用程序中,您可以使用锁来确保一个命令不会在同一时间(在相同或不同的服务器上)执行多次。

类创建锁欧宝娱乐app下载地址Symfony \ \锁\ LockFactory组件类,又需要另一个类来管理锁的存储:

欧宝娱乐app下载地址Symfony \ \锁\ LockFactory组件;欧宝娱乐app下载地址symfony \ component \ lock \ store \ semaphorestore;$商店=新的Semaphorestore.();美元的工厂=新的LockFactory$商店);

调用CreateLock()方法。它的第一个参数是代表锁定资源的任意字符串。然后,呼叫到了获得()方法将尝试获取锁定:

/ /……$锁定=美元的工厂- >CreateLock.“pdf-invoice-generation”);如果$锁定- >收购()){//锁定资源“PDF-ovoice-Generation”。//您可以在此处安全计算和生成发票。$锁定- >释放();}

如果无法获取锁定,则该方法返回错误的.这获得()方法可以重复安全地调用,即使已经获取了锁。

笔记

与其他实现不同,锁定组件即使在相同资源创建它们时也可以区分锁定实例。这意味着对于给定的范围和资源,可以多次获取一个锁定实例。如果必须由几个服务使用锁,则它们应该共享相同的实例返回的LockFactory: createLock方法。

小费

如果你不显式地释放锁,它将在实例销毁时自动释放。在某些情况下,跨多个请求锁定一个资源可能很有用。控件的第三个参数可以禁用自动释放行为CreateLock()方法错误的

序列化锁

关键包含的状态并且可以序列化。这允许用户在一个进程中通过获得锁开始一个长作业,并在其他进程中使用相同的锁继续该作业:

欧宝娱乐app下载地址Symfony \ \锁\关键组件;欧宝娱乐app下载地址Symfony \组件\ \锁锁;美元的关键=新的关键'文章。'$文章- >getId());$锁定=新的美元的关键这个美元- >商店300错误的);$锁定- >收购真的);这个美元- >公共汽车- >派遣新的RefreshTaxonomy$文章美元的关键));

笔记

别忘了禁用自动释放以避免在调用析构函数时释放锁定。

并非所有商店都兼容序列化和交叉流程锁定:例如,内核将自动释放由此获得的信号量Semaphorestore.店铺。如果使用不兼容的商店,应用程序尝试序列化键时将抛出异常。

阻塞锁

默认情况下,无法获取锁定时,收购方法退货错误的立即。要(无限期地)等待锁可以被创建,请传递真的作为论证获得()方法。这被称为a阻塞锁因为申请的执行停止,直到获取锁定。

一些内置的店铺类支持此特性。如果没有,就可以用重试illsavestore.类:

欧宝娱乐app下载地址Symfony \ \锁\ LockFactory组件;欧宝娱乐app下载地址Symfony \ \锁\ \ RedisStore存储组件;欧宝娱乐app下载地址Symfony \ Component \ Lock \ Store \ RetryTillSavestore;$商店=新的redisstore.新的\ predis \客户“tcp: / / localhost: 6379”));$商店=新的重试illsavestore.$商店);美元的工厂=新的LockFactory$商店);$锁定=美元的工厂- >CreateLock.'通知 - 齐平');$锁定- >收购真的);

当提供的商店没有实现时欧宝娱乐app下载地址Symfony \ \锁\ BlockingStoreInterface组件界面,界面类将以非阻塞方式重试获取锁,直到获得锁为止。

自版本5.2以来已弃用:as sym欧宝娱乐app下载地址fony 5.2,您不需要使用重试illsavestore.课程了。这类现在提供在阻塞模式下获取锁的默认逻辑,当存储没有实现BlockingStoreInterface接口。

到期锁

远程创建的锁很难管理,因为没有远程方法店铺要知道储物柜过程是否还活着。由于错误,致命错误或分段错误,无法保证release ()将调用方法,这将导致资源无限锁定。

在这些情况下,最好的解决方案就是创建到期锁,在经过一段时间后自动释放(称为TTL for是时候生活了)。这次以秒为单位配置为第二个参数CreateLock()方法。如果需要,这些锁也可以提前释放release ()方法。

使用到期锁时,最棘手的部分选择正确的TTL。如果它太短,其他流程可以在完成工作之前获取锁;如果它太长,并且在召唤之前的过程崩溃了release ()方法,资源将保持锁定,直到超时:

/ /……//创建一个持续30秒的过期锁$锁定=美元的工厂- >CreateLock.“charts-generation”30.);如果!!$锁定- >收购()){返回;}尝试{//在不到30秒的时间内执行作业}最后{$锁定- >释放();}

小费

为了避免锁处于锁定状态,建议将作业包装在try/catch/finally块中,以始终尝试释放即将到期的锁。

对于长时间运行的任务,最好从一个不太长的TTL开始,然后使用refresh ()将TTL重置为其原始值的方法:

/ /……$锁定=美元的工厂- >CreateLock.“charts-generation”30.);如果!!$锁定- >收购()){返回;}尝试{尽管!!$完成{//完成工作的一小部分。//续订锁定30秒。$锁定- >刷新();}}最后{$锁定- >释放();}

小费

用于长期运行任务的另一种有用的技术是将自定义TTL传递为一个参数refresh ()修改默认锁TTL的方法:

$锁定=美元的工厂- >CreateLock.“charts-generation”30.);/ /……//刷新锁30秒$锁定- >刷新();/ /……//刷新锁定600秒(下一个刷新()呼叫再次为30秒)$锁定- >刷新600);

此组件还提供了与到期锁相关的两个有用方法:getRemainingLifetime ()(返回空值或者浮动秒)和isexpired()(返回一个布尔值)。

自动解锁

当锁定对象被破坏时,锁会自动释放。这是一个实现细节,当在进程之间共享锁时,这将是重要的。在下面的例子中,pcntl_fork()创建两个进程,一旦一个进程结束,锁就会自动释放:

/ /……$锁定=美元的工厂- >CreateLock.'报告 - 生成'3600);如果!!$锁定- >收购()){返回;}$ pid=pcntl_fork();如果-1===.$ pid{//无法叉出口1);}elseif$ pid{/ /父进程睡觉30.);}别的{/ /子进程回声'锁现在将被释放。';出口0.);}/ /……

禁用此行为,设置为错误的第三个论点lockfactory :: createLock().这将使锁定持续3600秒或直到锁:: reasel()被称为。

共享锁

5.2新版功能:共享锁(以及关联的acquireRead ()方法和SharedLockStoreInterface)在Symfony 5.2中被引入。欧宝娱乐app下载地址

一个共同的或readers-writer锁是一个同步原语,允许对只读操作的并发访问,而写操作需要独占访问权限。这意味着多个线程可以并行读取数据,而是需要读取或修改数据所需的独占锁定。它们用于例如无法原子更新的数据结构,并且在更新完成之前无效。

使用acquireRead ()方法获取只读锁,而现有的获得()获取写入锁的方法:

$锁定=美元的工厂- >CreateLock.'用户'$用户- >ID);如果!!$锁定- >acquireRead()){返回;}

类似于获得()方法,通过真的作为论证acquireRead ()要以阻塞模式获取锁:

$锁定=美元的工厂- >CreateLock.'用户'$用户- >ID);$锁定- >acquireRead真的);

笔记

优先政策Sym欧宝娱乐app下载地址fony的共享锁取决于基础商店(例如Redis Store优先考虑读者VS作家)。

当使用该方法获取只读锁定时acquireRead (),这是可能的促进锁定,并将其更改为写锁定,通过调用获得()方法:

$锁定=美元的工厂- >CreateLock.'用户'$ userid.);$锁定- >acquireRead真的);如果!!这个美元- >肩膀$ userid.))){返回;}$锁定- >收购真的);//推广锁定写锁定这个美元- >更新$ userid.);

同样的,也有可能降级写锁,并通过调用它来将其更改为只读锁定acquireRead ()方法。

当提供的商店没有实现时欧宝娱乐app下载地址symfony \ component \ lock \ sharedlockstoreInterface界面,界面类将通过调用获得()方法。

锁的主人

第一次获取的锁是拥有的[1]由这件事获取它的实例。如果您需要检查当前是否实例(仍然)是锁的所有者,您可以使用isAcquired()方法:

如果$锁定- >isAcquired.()){//我们(仍然)拥有锁}

由于一些锁定存储的事实具有到期锁(如上所述和解释),因此可能会丢失自动获取的锁定:

//如果我们无法获得自己,这意味着其他一些进程已经在努力如果!!$锁定- >收购()){返回;}这个美元- >Begintransaction.();//执行一个可能超过锁TTL的长期进程如果$锁定- >isAcquired.()){//所有的一切都很好,没有其他实例已经获得了锁在此期间,我们是安全的这个美元- >提交();}别的{// bummer!我们的锁定显然超过了TTL,另一个过程已经开始//与我们承诺不安全。这个美元- >回滚();新的\例外'流程失败');}

谨慎

常见的缺陷可能是使用isAcquired()检查锁是否已被任何过程获取的方法。正如您在此示例中看到的,您必须使用获得()为了这。这isAcquired()方法用于检查锁是否已被当前进程只要!

[1] 从技术上讲,锁的真正所有者是那些共享相同实例的人关键,而不是.但是从用户的角度来看,关键是内部的,你可能只会与之合作实例,所以想到这一点更容易实例是作为锁所有者的实例。

可用商店

锁定是创建和管理的,这是实现的课程欧宝娱乐app下载地址symfony \ component \ lock \ persistingstoreinterface并且,可选的,欧宝娱乐app下载地址Symfony \ \锁\ BlockingStoreInterface组件

该组件包括以下内置存储类型:

店铺 范围 封锁 即将到期的 分享
FlockStore 当地的 是的 是的
memcachedstore. 偏僻的 是的
Mongodbstore. 偏僻的 是的
PdoStore 偏僻的 是的
postgresqlstore. 偏僻的 是的 是的
redisstore. 偏僻的 是的 是的
Semaphorestore. 当地的 是的
zookeperstore. 偏僻的

FlockStore

FlockStore使用本地计算机上的文件系统来创建锁。它不支持到期,但是当锁对象超出范围时,锁会自动释放,并且由垃圾收集器释放(例如,当PHP进程结束时):

欧宝娱乐app下载地址symfony \ component \ lock \ store \ flockstore;//参数是创建锁的目录的路径//如果没有给出,则在内部使用sys_get_temp_dir()。$商店=新的FlockStore'/ var / stores');

谨慎

请注意某些文件系统(例如某些类型的NFS)不支持锁定。在这些情况下,最好使用本地磁盘驱动器上的目录或基于PDO,REDIS或MEMCACH的远程存储器。

memcachedstore.

MemcachedStore在Memcached Server上保存锁,它需要实现Memcached Connection实现\ memcached.班级。此商店不支持阻塞,并期望TTL避免停滞锁:

欧宝娱乐app下载地址symfony \ component \ lock \ store \ memcachedstore;$ memcached.=新的\ memcached.();$ memcached.- >添加服务器“localhost”11211.);$商店=新的memcachedstore.$ memcached.);

笔记

Memcached不支持TTL小于1秒。

Mongodbstore.

5.1新版功能:Mongodbstore.在Symfony 5.1中引入。欧宝娱乐app下载地址

MongoDB存储存储MongoDB服务器上的锁> = 2.2,它需要\ mongodb \集合或者\ MongoDB \客户mongodb / mongodb或者MongoDB连接字符串.该存储不支持阻塞,并期望TTL避免阻塞锁:

欧宝娱乐app下载地址symfony \ component \ lock \ stort \ mongodbstore;$ mongo.='mongodb:// localhost / database?collection = lock';$选项=['gcprobablity'=>0.001'数据库'=>“myapp”'收藏'=>'锁''urioptions'=>[],'司机选修'=>[],];$商店=新的Mongodbstore.$ mongo.$选项);

Mongodbstore.需要以下$选项(取决于第一个参数类型):

选项 描述
gcprobablity. 如果创建TTL索引表示为0.0到1.0的概率(默认值0.001
数据库 数据库的名称
集合 集合的名称
uriOptions URI选项数组MongoDBClient: __construct
司机选项 驾驶员选项数组MongoDBClient: __construct

当第一个参数是a时:

mongodb \系列

  • $ options ['database']被忽略
  • $ options ['集合']被忽略

MongoDB \客户

  • $ options ['database']是强制性的
  • $ options ['集合']是强制性的

MongoDB连接字符串:

  • $ options ['database']另外使用/路径从DSN,至少一个是强制性的
  • $ options ['集合']另外使用?集合=从DSN,至少一个是强制性的

笔记

集合参数不属于MongoDB连接字符串定义。它用于允许构建一个Mongodbstore.用一个数据源名称(DSN)没有$选项

PdoStore

PDostore将锁存在SQL数据库中。它需要A.PDO.连接,A教义DBAL连接,或者数据源名称(DSN).此商店不支持阻塞,并期望TTL避免停滞锁:

欧宝娱乐app下载地址Symfony \ \锁\ \ PdoStore存储组件;//通过PDO懒惰连接的PDO,教义DBAL连接或DSNdatabaseConnectionOrDSN美元='mysql:host = 127.0.0.1; dbname = app';$商店=新的PdoStoredatabaseConnectionOrDSN美元[“db_username”=>'myuser'“db_password”=>“我的密码”]);

笔记

该存储不支持TTL小于1秒。

存储值的表将自动在第一次调用上创建save ()方法。还可以通过调用CreateTable()代码中的方法。

postgresqlstore.

PostgreSQLSTORE使用咨询锁提供的PostgreSQL。它需要A.PDO.连接,A教义DBAL连接,或者数据源名称(DSN).它支持本地阻塞,以及共享锁:

欧宝娱乐app下载地址symfony \ component \ lock \ store \ postgreesqlstore;//通过PDO懒惰连接的PDO,教义DBAL连接或DSNdatabaseConnectionOrDSN美元=postgresql: / / myuser:(电子邮件保护):5634 /锁';$商店=新的postgresqlstore.databaseConnectionOrDSN美元);

与之相反PdoStore, 这postgresqlstore.不需要表来存储锁,而且不会过期。

5.2新版功能:postgresqlstore.在Symfony 5.2中引入。欧宝娱乐app下载地址

redisstore.

RedisStore在Redis服务器上保存锁,它需要一个Redis连接实现\ redis.\ redisarray.\ rediscluster.或者\ Predis课程。此商店不支持阻塞,并期望TTL避免停滞锁:

欧宝娱乐app下载地址Symfony \ \锁\ \ RedisStore存储组件;$ redis.=新的\ redis.();$ redis.- >连接“localhost”);$商店=新的redisstore.$ redis.);

Semaphorestore.

Semaphorestore使用PHP信号量函数要创建锁:

欧宝娱乐app下载地址symfony \ component \ lock \ store \ semaphorestore;$商店=新的Semaphorestore.();

合计馆

组合的安装程序专为高可用性应用程序而设计,因为它在同步中管理多个存储(例如,多个Redis服务器)。获取锁时,它将调用所有受管存储的调用,它收集它们的响应。如果一个简单的大多数商店已经获得了锁定,那么锁被认为是获取的;否则不是收购:

欧宝娱乐app下载地址Symfony \ \锁\ \ CombinedStore存储组件;欧宝娱乐app下载地址Symfony \ \锁\ \ RedisStore存储组件;欧宝娱乐app下载地址Symfony \ Component \ Lock \策略\ Consensusstrategy;$商店=[];Foreach.(['server1''server2''server3']作为美元的服务器{$ redis.=新的\ redis.();$ redis.- >连接美元的服务器);$商店[]=新的redisstore.$ redis.);}$商店=新的合计馆$商店新的达成共识());

而不是简单多数策略(达成共识)一个unanimousstinggy.可用于要求在所有商店中获取锁。

谨慎

为了在使用时获得高可用性达成共识,最小群集大小必须是三个服务器。这允许群集在单个服务器发生故障时继续工作(因为此策略要求在超过一半的服务器中获取锁定)。

zookeperstore.

zookeeperstore保存锁动物园管理员服务器。它需要一个ZooKeeper连接来实现\动物园管理员班级。此商店不支持阻塞和到期,但是当PHP进程终止时,锁会自动释放:

欧宝娱乐app下载地址symfony \ component \ lock \ store \ zookeeperstore;美元的动物园管理员=新的\动物园管理员'localhost:2181');//使用以下内容来定义高可用性集群:// $zookeeper = new \ zookeeper ('localhost1:2181,localhost2:2181,localhost3:2181');$商店=新的zookeperstore.美元的动物园管理员);

笔记

Zookeeper不需要TTL,因为用于锁定的节点是短暂的,当PHP进程终止时就会死亡。

可靠性

组件保证了只要以下列方式使用组件即可锁定相同的资源两倍。

偏远商店

遥控商店(memcachedstore.Mongodbstore.PdoStorepostgresqlstore.redisstore.zookeperstore.)使用唯一的令牌来识别锁定的真正所有者。此令牌存储在欧宝娱乐app下载地址Symfony \ \锁\关键组件对象内部使用,因此这个键不能在进程之间共享(会话,缓存,fork,…)。

谨慎

不要在流程之间共享密钥。

每个并发进程必须存储在同一台服务器上。否则,两个不同的机器可能允许两个不同的进程获得相同的

谨慎

为了保证同一台服务器始终是安全的,请不要在LoadBalancer,群集或圆形robin dns后面使用memcached。即使主服务器已关闭,呼叫也不得转发到备份或故障转移服务器。

到期商店

到期的商店(memcachedstore.Mongodbstore.PdoStoreredisstore.)保证仅在规定的时间段内获得锁定。如果任务需要更长时间才能完成,那么锁可以由商店释放并由其他人获取。

提供几个检查其运行状况的方法。这isexpired()方法检查其寿命是否结束getRemainingLifetime ()方法返回其在秒内的时间。

使用上述方法,更强大的代码是:

/ /……$锁定=美元的工厂- >CreateLock.“invoice-publication”30.);如果!!$锁定- >收购()){返回;}尽管!!$完成{如果$锁定- >GetRemainingLifetime.()<=5.{如果$锁定- >isExpired()){//锁丢失,执行回滚或发送通知新的\ RuntimeException“在整个过程中锁丢失”);}$锁定- >刷新();}//执行时间必须小于5分钟的任务}

谨慎

明智地选择的一生并检查其剩下的剩余时间是否足以执行任务。

谨慎

存放A.通常需要几毫秒,但网络条件可能会增加很多时间(多达几秒)。在选择正确的TTL时要考虑到这一点。

通过设计,锁存存储在具有定义寿命的服务器中。如果机器的日期或时间发生变化,则锁定可以释放多于预期的锁。

谨慎

为了保证日期不会更改,应禁用NTP服务,并且在停止服务时应更新日期。

FlockStore

通过使用文件系统,这个店铺是可靠的,只要并发进程使用相同的物理目录来存储锁。

进程必须在同一台计算机,虚拟机或容器上运行。更新Kubernetes或Swarm服务时要小心,因为在短时间内,可以并行有两个运行的容器。

目录的绝对路径必须保持不变。小心在随时改变的符号链接:Capistrano和Blue / Green Deployment经常使用该技巧。当该目录的路径在两个部署之间发生更改时要小心。

有些文件系统(例如某些类型的NFS)不支持锁定。

谨慎

所有并发进程必须通过在同一台计算机上运行并使用相同的绝对路径来锁定目录来使用相同的物理文件系统。

根据定义,使用FlockStore在HTTP上下文中与多个前置服务器不兼容,除非确保将始终锁定在同一台计算机上或使用良好配置的共享文件系统。

在维护操作期间可以删除文件系统上的文件。例如,清理/ tmp目录,或者在计算机重新启动后,当目录使用tmpfs时。这不是一个问题,如果锁释放时,进程结束,但它是在情况下在请求之间重复使用。

谨慎

如果必须在多个请求中重用volatile文件系统上的锁,则不要将它们存储在volatile文件系统上。

memcachedstore.

Memcached的工作方式是在内存中存储项目。这意味着通过使用memcachedstore.锁不持续存在,可能随时消失。

如果MEMCACHED服务或机器托管它重新启动,则在不通知运行进程的情况下将丢失每个锁。

谨慎

为避免其他人在重新启动后获取锁,建议延迟服务启动并至少等待只要最长的锁定TTL。

默认情况下,MEMCACHED使用LRU机制在服务需要空间添加新项目时删除旧条目。

谨慎

存储在MEMCACHED中的项目数必须在控制下。如果不可能,LRU应被禁用,并且锁定应存储在远离缓存的专用MEMCACHED服务中。

当MEMCACHED服务共享并用于多个使用时,可以错误地删除锁定。例如PSR-6的一些实现clear ()方法使用Memcached的flush()方法,它清除和删除所有内容。

谨慎

方法flush()不能被调用,否则锁应该存储在远离Cache的专用Memcached服务中。

Mongodbstore.

谨慎

中的索引锁定的资源名_ID锁集合的字段。请注意,在MongoDB索引字段的值可以是最大长度为1024字节包括结构性开销。

必须使用TTL索引来自动清理过期的锁。可以手动创建这样的索引:

1 2 3 4
D bensureIndex{“affires_at”1},{“expireAfterSeconds”0.}

或者,方法mongodbstore :: createtlindex(intexpireAfterSeconds美元=0)可以调用一次以在数据库设置期间创建TTL索引。阅读更多信息通过设置TTL使集合中的数据过期在MongoDB。

小费

Mongodbstore.将尝试自动创建TTL索引。它建议设置构造函数选项gcprobablity.=0.0如果您手动处理TTL索引创建,则禁用此行为。

谨慎

该商店依赖于所有PHP应用程序和数据库节点,以具有同步时钟,以便在正确的时间发生锁定到期。确保锁不会过早过期;锁定TTL应设置有足够的额外时间expireAfterSeconds要考虑节点之间的任何时钟漂移。

writeConcernreadConcern.没有被MongoDbStore指定,这意味着集合的设置将生效。readPreference对于所有查询。阅读更多信息副本集读和写语义在MongoDB。

PdoStore

PdoStore依赖于SQL引擎的属性。

谨慎

在配置有多个初选的集群中,确保将写入同步地传播到每个节点,或始终使用相同的节点。

谨慎

像MySQL这样的SQL引擎允许禁用唯一的约束检查。确保不如案unique_checks = 1;

为了清除旧锁,此商店使用当前日期时间来定义到期日期引用。此机制依赖于所有服务器节点具有同步时钟。

谨慎

确保锁不会过早过期;应该为ttl设置足够的额外时间,以考虑节点之间的任何时钟漂移。

postgresqlstore.

PdoStore依赖于咨询锁PostgreSQL数据库的属性。这意味着通过使用postgresqlstore.如果客户端由于任何原因无法解锁,锁定将在会话结束时自动释放。

如果PostgreSQL服务或承载它的机器重新启动,每个锁都会丢失,而不会通知正在运行的进程。

如果TCP连接丢失,PostgreSQL可能会在不通知该应用程序的情况下释放锁。

redisstore.

Redis Works的方式是将物品存储在内存中。这意味着通过使用redisstore.锁不持续存在,可能随时消失。

如果Redis服务或机器托管它重新启动,则在不通知运行进程的情况下将丢失每个锁。

谨慎

为避免其他人在重新启动后获取锁,建议延迟服务启动并至少等待只要最长的锁定TTL。

小费

Redis可以配置为在磁盘上持久化条目,但是这个选项会降低服务写操作的速度。这可能会妨碍服务器的其他使用。

当Redis服务被共享并被用于多种用途时,锁可能会被错误地删除。

谨慎

命令FLUSHDB不得调用,或者锁定应存储在远离缓存的专用REDIS服务中。

合计馆

组合商店允许在多个后端存储锁。认为锁定机制更加可靠,这是一个常见的错误。这是错误的。这合计馆在最好的情况下,会像所有管理的商店中最不可靠的一样可靠。一旦一个管理的商店返回错误的信息,合计馆不会是可靠的。

谨慎

所有并发进程必须使用相同的配置,具有相同数量的管理存储和相同的端点。

小费

而不是使用一群redis或memcached服务器,最好使用a合计馆使用每个托管商店的单个服务器。

Semaphorestore.

信号量由内核级别处理。为了可靠,进程必​​须在同一台机器,虚拟机或容器上运行。更新Kubernetes或Swarm服务时要小心,因为在短时间内,可以并行有两个运行的容器。

谨慎

所有并发进程必须使用同一台机器。在新机器上启动并发进程之前,请检查旧机器上是否停止了其他进程。

谨慎

当在systemd上运行非系统用户和选项时remomipc =是的(默认值),锁定被systemd删除时,该用户登出。检查该进程是与系统用户(UID <= SYS_UID_MAX)一起运行的SYS_UID_MAX定义/etc/login.defs,或设置选项remomipc =关闭/etc/systemd/logind.conf.

zookeperstore.

ZookeeperStore的工作方式是在服务器上以临时节点的形式维护锁。这意味着通过使用zookeperstore.如果客户端由于任何原因无法解锁,锁定将在会话结束时自动释放。

如果zookeeper服务或托管它重新启动,则在不通知运行进程的情况下将丢失每个锁。

小费

要使用zookeeper的高可用性功能,可以设置多个服务器群集,以便在其中一个服务器下降时,大多数仍将启动并服务于请求。群集中的所有可用服务器都会看到相同的状态。

笔记

由于该存储不支持多级节点锁,由于中间节点的清理将成为一项开销,因此所有的锁都在根级别上维护。

整体

更改存储区的配置应该非常小心。例如,在新版本的部署期间。使用新配置的进程不能在使用旧配置的旧进程仍在运行时启动。

这项工作包括代码样本,是在a下获得的许可Creative Commons by-SA 3.0执照。