java - Terracotta 在这种情况下如何工作?

标签 java failover high-availability terracotta

假设我有一个 N 大小的服务器阵列设置如下:

alt text http://www.terracotta.org/web/download/attachments/43909161/ServerArrayMirrorGroup.png

我有一个简单的 JavaBean/POJO:

package example;

public class Person {
  private OtherObject obj;

  public void setObj(OtherObject theObj) {
    synchronized (this) {
      obj = theObj;
    }
  }

  public OtherObject getObj() {
    synchronized (this) {
      return obj;
    }
  }
}

现在,如果其中一个客户端在 TC 根(数据结构)中的 Person 对象上调用 Person.setObj(OtherObject),则同步块(synchronized block)(在 Person.setObj(OtherObject) 中)该客户持有:

1) 直到 N 大小的服务器阵列中的所有 N 服务器都已与该 Person.obj 属性同步/更新?

2) 在“Activity ”服务器与更新的 Person.obj 属性同步之前?那么阵列中的其他(N-1)台服务器是否尽可能同步?

3) 我忽略的其他方法?

最佳答案

答案实际上不是 1 或 2。对象跨服务器镜像组 strip 化。第一次设置此字段时,将创建一个事务,并且为第一个事务选择的镜像组将“拥有”此后的对象。

关于 1 和 2,并非所有 Activity 服务器组都需要更新,因此无需等待这些条件中的任何一个。

您可以在 Terracotta 文档中找到有关配置 Terracotta 服务器阵列的更多信息:

从锁定的角度来看,在执行对象修改时将持有此 Person 对象上的集群锁(跨集群互斥)。同步块(synchronized block)的作用域形成了上面提到的事务。在 getObj() 方法中,您可以将其配置为读锁,允许多个并发读取器跨集群。

关于java - Terracotta 在这种情况下如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/815243/

相关文章:

java - newCachedThreadPool如何复用线程?

java - 在查询字符串中发送 XML

java - JDBC 语句无法删除特定 MySql 表中的行

storage - 高可用存储

google-cloud-platform - Google Cloud Load Balancer 是否存在单点故障?我们可以有一个备用副本吗?

java - List<T> 重写 toArray 最终作为 T1[] toArray

java - HttpServletResponse.sendError 之后过滤器中需要返回

Redis 高可用性 - 如果主节点发生故障则增加同步

java - ActiveMQ 集群可以有在不同传输协议(protocol)上运行的代理吗?

azure - 是 Azure Traffic Manager 还是 Azure front Door in front 用于多区域系统架构?