基于乐观锁的配置服务器与XServer的交互

  XServer与配置服务器,配置服务器保存有XServer的配置文件中的信息。如何在项目启动时,让XServer从配置服务器中获取到自己的配置信息,并达到通信资源的节省与控制。



通信如下:

  1. XServer与配置服务器都启动,没有先后顺序之分,初始配置服务器知道XServer的XServerHost和XServerPost,但是XServer不知道配置服务器的CfgHost和CfgPort;
  2. 配置服务器启动线程不停的向XServer发送信息Info1,信息Info1包含配置服务器的CfgHost和CfgPort,以及XServer的配置文件的版本号XServerCfgVersion=V1;
  3. XServer收到CfgHost、CfgPort、XServerCfgVersion后,判断从本地存储的配置文件中自己的版本号V2和V1的关系。如果V1=V2,向配置服务器发送NotRequestResource事件,意思是我不需要别的东西了,结束。如果V1!=V2,记录标记flag=true(初始flag=false);
  4. XServer连接配置服务器的类中启动一个线程不停的判断标记flag,如果flag=true,就向配置服务器发送RequestResource事件,意思是版本号不一样,我要我的配置资源;如果flag=false,啥都不干。
  5. 配置服务器收到RequestResource事件,做两件事情,一是停止发送信息Info1,二是不停的向XServer发送它的配置资源信息Info2,Info2中除了XServer的配置资源信息外,还有配置服务器的CfgHost和CfgPort。
  6. XServer收到Info2后,将Info1和Info2都写入到本地配置文件中,之后所有的读取都从本地配置文件中读取,同时使flag=false,然后向配置服务器发送确认消息Info3
  7. 配置服务器收到Info3后,停止向XServer发送信息Info2,结束。


注意问题:

  • 假如当XServer和配置服务器都在运行中,这时配置服务器修改了XServer的配置资源,事件触发这时配置服务器得不停向XServer发送Info1和Info2,直到收到确认Info3;
  • 假如XServer和配置服务器都在运行中,一是突然配置服务器断了,稍后重启,向XServer发送Info1,XServer收到后判断V1=V2,发送NotRequestResource,结束;二是突然XServer断了,分两种可能,断期间配置服务器中XServer的配置资源未改,重启XServer无碍,断期间配置资源改动了,一旦改动,执行上面的不停向XServer发送Info1和Info2,等到XServer重启,也能收到Info1和Info2,不影响系统;
  • 假如XServer收到Info1后,发送RequestResource事件,配置服务器收到RequestResource事件,停止了Info1发送,但Info2发送前

    – XServer断掉,分两种情况,一是配置服务器CfgHost和CfgPort不变,配置服务器由于未收到确认Info3而一直发送Info2,重启XServer,XServer能收到Info2,这里加Info3确认可以,也可以在配置服务器端监听连接,有服务模块连接到它,它就向之发送Info1。这时上面的情况中当重启XServer,配置服务器检测到XServer连接到它了,发送Info1;二是期间配置服务器CfgHost和CfgPort改变了,配置服务器由于未收到确认Info3而一直发送Info2,如果Info2中不带CfgHost和CfgPort,那么万一下次指不定什么时候XServer断开了,由于配置服务器的CfgHost和CfgPort改了,就再也连不上了;

    –配置服务器断掉了,重启配置服务器,它发送Info1,不影响系统。

时间: 2024-10-12 12:13:43

基于乐观锁的配置服务器与XServer的交互的相关文章

3:基于乐观锁(两种)控制并发: version、external锁

ES是基于乐观锁进行并发控制的. 如果有并发的业务场景,可以直接使用ES内置乐观锁机制. 使用的时候,java程序需要先Get指定的记录,获取到版本号,然后Put的时候,带着该版本号,请求更新. ES只有判断到 该记录的 version = 请求中的version值 时,才能进行更新.如果不相等,则舍弃. 下面演示如何使用乐观锁: 1. 先创建一条记录,此时ES返回信息中会有标识: version=1 PUT  /test_index/test_type/1 { "f1":"

基于asp.net MVC 的服务器和客户端的交互(二)之获取Oauth 2.0认证权限

基本Web API的ASP.NET的Oauth2认证 增加Token额外字段 增加Scope授权字段 持久化Token 设计Token的时间间隔 刷新Token后失效老的Token 自定义验证[重启IIS池Token失效,验证权限] Oauth2 认证的流程 客户端发送口令(grant_type,client_id,client_secret)到服务端请求,认证返回access token ,然后客户端跟据获得的access token,根据Access Token获得权限去访问Web API.

基于asp.net MVC 的服务器和客户端的交互(三)之客户端请求响应

一.分析 WEB API 中HTTP 请求方式的四个主要方法 (GET, PUT, POST, DELETE), 按照下列方式映射为 CURD 操作: GET 用于获取 URI 资源的进行展示,GET 操作不应对服务端有任何影响,用于数据集合的Select查询: PUT 用于更新 URI 上的一个资源,如果服务端允许,PUT 也可以用于新建一个资源,用于相关的Insert插入操作: POST 用于新建资源,服务端在指定的URI 上创建一个新的对象,将新资源的地址作为响应消息的一部分返回,用于相关

JAVA乐观锁实现-CAS

是什么 全称compare and swap,一个CPU原子指令,在硬件层面实现的机制,体现了乐观锁的思想. JVM用C语言封装了汇编调用.Java的基础库中有很多类就是基于JNI调用C接口实现了多线程同步更新的功能. 原理 CMS有三个操作数:当前主内存变量的值V,线程本地变量预期值A,线程本地待更新值B.当需要更新变量值的时候,会先获取到内存变量值V然后很预期值A进行比较,如果相同则更新为B,如果不同,则将最新的变量值更新到预期值中再重新尝试上面的步骤,直到成功为止. 举例 以基于CAS实现

AtomicInteger源码分析——基于CAS的乐观锁实现

AtomicInteger源码分析--基于CAS的乐观锁实现 1. 悲观锁与乐观锁 我们都知道,cpu是时分复用的,也就是把cpu的时间片,分配给不同的thread/process轮流执行,时间片与时间片之间,需要进行cpu切换,也就是会发生进程的切换.切换涉及到清空寄存器,缓存数据.然后重新加载新的thread所需数据.当一个线程被挂起时,加入到阻塞队列,在一定的时间或条件下,在通过notify(),notifyAll()唤醒回来.在某个资源不可用的时候,就将cpu让出,把当前等待线程切换为阻

AtomicInteger源码分析——基于CAS的乐观锁实

1. 悲观锁与乐观锁 我们都知道,cpu是时分复用的,也就是把cpu的时间片,分配给不同的thread/process轮流执行,时间片与时间片之间,需要进行cpu切换,也就是会发生进程的切换.切换涉及到清空寄存器,缓存数据.然后重新加载新的thread所需数据.当一个线程被挂起时,加入到阻塞队列,在一定的时间或条件下,在通过notify(),notifyAll()唤醒回来.在某个资源不可用的时候,就将cpu让出,把当前等待线程切换为阻塞状态.等到资源(比如一个共享数据)可用了,那么就将线程唤醒,

Centos6.5基于SSL加密的VSFTPD 服务器搭建和配置

基于SSL加密的VSFTPD 服务器搭建和配置 一.yum install -y vsftpd ftp 主配置文件设置: vim /etc/vsftpd.conf anonymous_enable=NOguest_enable=YESguest_username=virtual user_config_dir=/etc/vsftpd/vconflocal_enable=YESwrite_enable=YESlocal_umask=022dirmessage_enable=YESxferlog_e

基于redis的乐观锁

转自:https://www.toutiao.com/i6503412526095532558/?tt_from=weixin&utm_campaign=client_share&timestamp=1514535595&app=news_article&utm_source=weixin&iid=22004594589&utm_medium=toutiao_android&wxshare_count=1 在游戏开发中,我们有时需要实现乐观锁功能,乐

ElasticSearch(九)基于version进行乐观锁并发控制

一.基于version进行乐观锁并发控制 1).查看一条document GET /test_version/test_version_type/1 { "_index" : "test_version", "_type" : "test_version_type", "_id" : "1", "_version" : 1, "found" : t