有些变量需要在不同服务器上实现同步,如果异步调用是需要对资源设置锁,保证数据的一致性的。
在正常情况下用线程锁就可以了,但是分布式情况下比较特殊。
有两种实现方法:
1、通过数据库插入删除操作作为分布式锁,如果想要对某个方法执行,需要向数据库中插入一条数据,
INSERT INTO method_lock (method_name, desc) VALUES ('methodName', '测试的methodName');
设置method_name的唯一性,这样就保证在并发量大的情况下无法同时操作同一个方法。
然后方法执行完再删除这条数据。
delete from method_lock where method_name ='methodName';
这种可能出现死锁问题,因此应定期对数据进行清理。
2、基于redis实现
(1)SETNX
SETNX key val:当且仅当key不存在时,set一个key为val的字符串,返回1;若key存在,则什么都不做,返回0。
1
(2)expire
expire key timeout:为key设置一个超时时间,单位为second,超过这个时间锁会自动释放,避免死锁。
1
(3)delete
delete key:删除key
博主还有一个zookeeper实现的方式,看的不是很懂,就不写了
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
然后就是不同服务器之间的时间同步问题,这个通常用ntp进行时间同步,大致就是设置一台服务器作为基准机器并部署ntp,然后部署其他机器为从机,有一个问题是
比如说有一个定时执行的脚本,现在从机的时间是13:00,而主机的时间是12:30,这个脚本中的任务是在12:40执行的,但是如果直接将时间进行同步,在丛机到12:40时的时候就会再次执行这个脚本,但是原则上这个东西在一天只能执行一次。
处理这个问题的方法,我看网上说的是有一个慢慢进行同步的方法,大概就是不直接将时间拉到13:00而是慢慢错位,移过去。