- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
给定的数据中心列表是 phx、slc、lvs 和机器列表、h0、h1、h2、h3,如下所述 -
Datacenters = phx, slc, lvs
Machines = h0, h1, h2, h3
我只想生成以下组合 -
a) phx - h0
slc - h1
lvs - h2
b) phx - h1
slc - h2
lvs - h3
c) phx - h2
slc - h3
lvs - h0
d) phx - h3
slc - h0
lvs - h1
我需要调用 getDatacenterMachineMapping
方法,它会给出上述结果。对于第一次调用,它应该在 coloHost
映射中给我上面的 a 结果
,在第二次调用中,它应该给我上面的 b 结果
在 coloHost
映射中,在第三次调用中,它应该在 coloHost
映射中给我上面的 c 结果
,对于第四次调用,它应该在 coloHost
map 和第五次调用中给我上面的 d 结果
,它不应该给我任何东西,因为没有留下任何组合。
private static List<String> colo = Arrays.asList("phx", "slc", "lvs");
private static List<String> hosts = Arrays.asList("h0","h1","h2", "h3");
while(true) {
Map<String, String> coloHost = getDatacenterMachineMapping();
System.out.println(coloHost);
}
private static Map<String, String> getDatacenterMachineMapping() {
// some code here?
}
每个 channel 中的每个数据中心都应该有备用机器/主机。他们不应该得到相同的机器。例如在 a
中,如上所示 - phx 获取 h0
,slc 获取 h1
,lvs 获取 h2
所以所有每个数据中心的机器都不同。在第二遍中,如 b
所示 - 现在 phx 得到 h1
(因为 phx 在第一遍中已经得到 h0),slc 得到 h2
(bcoz slc 在第一遍中已经得到 h1),并且 lvs 得到了 h3
(bcoz lvs 在第一遍中已经得到了 h2)等等。
还有一个例子——如果我只有三个主机,那么下面的组合我应该只得到——
Datacenters = phx, slc, lvs
Machines = h0, h1, h2
a) phx - h0
slc - h1
lvs - h2
b) phx - h1
slc - h2
lvs - h0
c) phx - h2
slc - h0
lvs - h1
有什么想法可以做到这一点吗?
更新:-
我试过你下面的代码,它工作正常。我在我的 main 方法中使用无限 while 循环,这意味着它会一直调用 getDatacenterMachineMapping
方法。所以这是我得到的输出,看起来不错。
{phx=h0, slc=h1, vs=h2}
{phx=h1, slc=h2, vs=h3}
{phx=h2, slc=h3, vs=h0}
{phx=h3, slc=h0, vs=h1}
{phx=h0, slc=h1, vs=h2}
{phx=h1, slc=h2, vs=h3}
{phx=h2, slc=h3, vs=h0}
因此,如果您查看上面打印出来的映射。前四个是我期望的唯一结果,之后我不希望 getDatacenterMachineMapping
给出任何结果,因为那样一次,phx 的所有四台机器都被打印出来,slc 的所有四台机器都被打印出来,vs 的所有四台机器都被打印出来。如果您看到第五行,它又开始了,我不希望 getDatacenterMachineMapping
给出结果。
下面是我试过的代码-
public static void main(String[] args) {
DatacenterMachineMapping dcm = new DatacenterMachineMapping(
Arrays.asList("phx", "slc", "vs"),
Arrays.asList("h0", "h1", "h2", "h3"));
while(true) {
Map<String, String> m1 = dcm.getDatacenterMachineMapping();
System.out.println(m1);
}
}
class DatacenterMachineMapping {
private boolean firstCall = true;
private int hostListIndex = 0;
private List<String> datacenterList, hostList;
public DatacenterMachineMapping(List<String> datacenterList, List<String> hostList) {
this.datacenterList = datacenterList;
this.hostList = hostList;
}
public Map<String, String> getDatacenterMachineMapping() {
Map<String, String> datacenterMachineMapping = new HashMap<String, String>();
if(! firstCall) {
if(hostListIndex == 0) {
hostListIndex = hostList.size();
}
hostListIndex--;
} else {
firstCall = false;
}
for(String datacenter : datacenterList) {
if(hostListIndex == hostList.size()) {
hostListIndex = 0;
}
datacenterMachineMapping.put(datacenter, hostList.get(hostListIndex++));
}
hostListIndex--;
return datacenterMachineMapping;
}
}
最佳答案
我可以从主机索引中看到的模式是,对 getDatacenterMachineMapping
的每个后续调用都从索引 i-1
开始,其中 i
是上一次调用的最后一个主机的索引。第一个调用从索引 0
开始,并围绕可用主机轮换。
例如,第一个主机列表:h0, h1, h2, h3
你有
1) 0=h0, 1=h1, 2=h2
最后一个索引是 2
,从中减去 1 -> 1
这是下一次调用应该开始的索引:
2) 1=h1, 2=h2, 3=h3
现在最后一个索引是 3,即你在 2
开始下一个调用,这在列表中只剩下两个主机,然后你必须轮换,即返回索引 0
同样,这给了你
3) 2=h2, 3=h3, 0=h0
第二个主机列表也是如此。
这里是上面的示例实现(可能需要进行调整以完全符合您的要求,例如检查数据中心是否已经有任何可能的主机,您可以将其与 set 一起包装到自己的类中已分配主机的 (HashSet):
public class DatacenterMachineMapping {
private boolean firstCall = true;
private int hostListIndex = 0;
private List<String> datacenterList, hostList;
public DatacenterMachineMapping(List<String> datacenterList, List<String> hostList) {
this.datacenterList = datacenterList;
this.hostList = hostList;
}
public Map<String, String> getDatacenterMachineMapping() {
Map<String, String> datacenterMachineMapping = new HashMap<>();
if(! firstCall) {
if(hostListIndex == 0) {
hostListIndex = hostList.size();
}
hostListIndex--;
} else {
firstCall = false;
}
for(String datacenter : datacenterList) {
if(hostListIndex == hostList.size()) {
hostListIndex = 0;
}
datacenterMachineMapping.put(datacenter, hostList.get(hostListIndex++));
}
hostListIndex--;
return datacenterMachineMapping;
}
}
还有一些测试...
public class DatacenterMachineMappingTest {
@Test
public void test1() {
DatacenterMachineMapping dcm = new DatacenterMachineMapping(
Arrays.asList("phx", "slc", "vs"),
Arrays.asList("h0", "h1", "h2", "h3"));
Map<String, String> m1 = dcm.getDatacenterMachineMapping();
Assert.assertEquals("h0", m1.get("phx"));
Assert.assertEquals("h1", m1.get("slc"));
Assert.assertEquals("h2", m1.get("vs"));
Map<String, String> m2 = dcm.getDatacenterMachineMapping();
Assert.assertEquals("h1", m2.get("phx"));
Assert.assertEquals("h2", m2.get("slc"));
Assert.assertEquals("h3", m2.get("vs"));
Map<String, String> m3 = dcm.getDatacenterMachineMapping();
Assert.assertEquals("h2", m3.get("phx"));
Assert.assertEquals("h3", m3.get("slc"));
Assert.assertEquals("h0", m3.get("vs"));
}
@Test
public void test2() {
DatacenterMachineMapping dcm = new DatacenterMachineMapping(
Arrays.asList("phx", "slc", "vs"),
Arrays.asList("h0", "h1", "h2"));
Map<String, String> m1 = dcm.getDatacenterMachineMapping();
Assert.assertEquals("h0", m1.get("phx"));
Assert.assertEquals("h1", m1.get("slc"));
Assert.assertEquals("h2", m1.get("vs"));
Map<String, String> m2 = dcm.getDatacenterMachineMapping();
Assert.assertEquals("h1", m2.get("phx"));
Assert.assertEquals("h2", m2.get("slc"));
Assert.assertEquals("h0", m2.get("vs"));
Map<String, String> m3 = dcm.getDatacenterMachineMapping();
Assert.assertEquals("h2", m3.get("phx"));
Assert.assertEquals("h0", m3.get("slc"));
Assert.assertEquals("h1", m3.get("vs"));
}
@Test
public void test3() {
DatacenterMachineMapping dcm = new DatacenterMachineMapping(
Arrays.asList("phx", "slc", "vs"),
Arrays.asList("h0", "h1"));
Map<String, String> m1 = dcm.getDatacenterMachineMapping();
Assert.assertEquals("h0", m1.get("phx"));
Assert.assertEquals("h1", m1.get("slc"));
Assert.assertEquals("h0", m1.get("vs"));
Map<String, String> m2 = dcm.getDatacenterMachineMapping();
Assert.assertEquals("h1", m2.get("phx"));
Assert.assertEquals("h0", m2.get("slc"));
Assert.assertEquals("h1", m2.get("vs"));
Map<String, String> m3 = dcm.getDatacenterMachineMapping();
Assert.assertEquals("h0", m3.get("phx"));
Assert.assertEquals("h1", m3.get("slc"));
Assert.assertEquals("h0", m3.get("vs"));
}
@Test
public void test4() {
DatacenterMachineMapping dcm = new DatacenterMachineMapping(
Arrays.asList("phx", "slc", "vs"),
Arrays.asList("h0", "h1", "h2", "h3", "h4", "h5", "h6"));
Map<String, String> m1 = dcm.getDatacenterMachineMapping();
Assert.assertEquals("h0", m1.get("phx"));
Assert.assertEquals("h1", m1.get("slc"));
Assert.assertEquals("h2", m1.get("vs"));
Map<String, String> m2 = dcm.getDatacenterMachineMapping();
Assert.assertEquals("h1", m2.get("phx"));
Assert.assertEquals("h2", m2.get("slc"));
Assert.assertEquals("h3", m2.get("vs"));
Map<String, String> m3 = dcm.getDatacenterMachineMapping();
Assert.assertEquals("h2", m3.get("phx"));
Assert.assertEquals("h3", m3.get("slc"));
Assert.assertEquals("h4", m3.get("vs"));
Map<String, String> m4 = dcm.getDatacenterMachineMapping();
Assert.assertEquals("h3", m4.get("phx"));
Assert.assertEquals("h4", m4.get("slc"));
Assert.assertEquals("h5", m4.get("vs"));
Map<String, String> m5 = dcm.getDatacenterMachineMapping();
Assert.assertEquals("h4", m5.get("phx"));
Assert.assertEquals("h5", m5.get("slc"));
Assert.assertEquals("h6", m5.get("vs"));
Map<String, String> m6 = dcm.getDatacenterMachineMapping();
Assert.assertEquals("h5", m6.get("phx"));
Assert.assertEquals("h6", m6.get("slc"));
Assert.assertEquals("h0", m6.get("vs"));
Map<String, String> m7 = dcm.getDatacenterMachineMapping();
Assert.assertEquals("h6", m7.get("phx"));
Assert.assertEquals("h0", m7.get("slc"));
Assert.assertEquals("h1", m7.get("vs"));
}
@Test
public void test5() {
DatacenterMachineMapping dcm = new DatacenterMachineMapping(
Arrays.asList("phx", "slc", "vs", "sls"),
Arrays.asList("h0", "h1", "h2", "h3", "h4", "h5", "h6"));
Map<String, String> m1 = dcm.getDatacenterMachineMapping();
Assert.assertEquals("h0", m1.get("phx"));
Assert.assertEquals("h1", m1.get("slc"));
Assert.assertEquals("h2", m1.get("vs"));
Assert.assertEquals("h3", m1.get("sls"));
Map<String, String> m2 = dcm.getDatacenterMachineMapping();
Assert.assertEquals("h2", m2.get("phx"));
Assert.assertEquals("h3", m2.get("slc"));
Assert.assertEquals("h4", m2.get("vs"));
Assert.assertEquals("h5", m2.get("sls"));
Map<String, String> m3 = dcm.getDatacenterMachineMapping();
Assert.assertEquals("h4", m3.get("phx"));
Assert.assertEquals("h5", m3.get("slc"));
Assert.assertEquals("h6", m3.get("vs"));
Assert.assertEquals("h0", m3.get("sls"));
Map<String, String> m4 = dcm.getDatacenterMachineMapping();
Assert.assertEquals("h6", m4.get("phx"));
Assert.assertEquals("h0", m4.get("slc"));
Assert.assertEquals("h1", m4.get("vs"));
Assert.assertEquals("h2", m4.get("sls"));
Map<String, String> m5 = dcm.getDatacenterMachineMapping();
Assert.assertEquals("h1", m5.get("phx"));
Assert.assertEquals("h2", m5.get("slc"));
Assert.assertEquals("h3", m5.get("vs"));
Assert.assertEquals("h4", m5.get("sls"));
Map<String, String> m6 = dcm.getDatacenterMachineMapping();
Assert.assertEquals("h3", m6.get("phx"));
Assert.assertEquals("h4", m6.get("slc"));
Assert.assertEquals("h5", m6.get("vs"));
Assert.assertEquals("h6", m6.get("sls"));
Map<String, String> m7 = dcm.getDatacenterMachineMapping();
Assert.assertEquals("h5", m7.get("phx"));
Assert.assertEquals("h6", m7.get("slc"));
Assert.assertEquals("h0", m7.get("vs"));
Assert.assertEquals("h1", m7.get("sls"));
}
}
编辑:
添加一个映射,用于映射每个数据中心及其已接收的主机:
private Map<String, Set<String>> dataCenterHostsMap = new HashMap<>();
现在添加一个将主机添加到数据中心的条件:只有在主机尚未添加时才可以添加主机:
if(addDataCenterHost(datacenter, hostList.get(hostListIndex))) {
datacenterMachineMapping.put(datacenter, hostList.get(hostListIndex++));
}
addDataCenterHost
方法如下所示:
private boolean addDataCenterHost(String datacenter, String host) {
Set<String> dataCenterHostSet = dataCenterHostsMap.get(datacenter);
if(dataCenterHostSet == null) {
dataCenterHostSet = new HashSet<String>();
dataCenterHostsMap.put(datacenter, dataCenterHostSet);
}
return dataCenterHostSet.add(host);
}
随着这个改变 test3
将不再成功运行,我想你知道为什么 ;-) 。
这里是一个更改后的 test1
,用于测试第 5 次调用。
@Test
public void test1() {
DatacenterMachineMapping dcm = new DatacenterMachineMapping(
Arrays.asList("phx", "slc", "vs"),
Arrays.asList("h0", "h1", "h2", "h3"));
Map<String, String> m1 = dcm.getDatacenterMachineMapping();
Assert.assertEquals("h0", m1.get("phx"));
Assert.assertEquals("h1", m1.get("slc"));
Assert.assertEquals("h2", m1.get("vs"));
Map<String, String> m2 = dcm.getDatacenterMachineMapping();
Assert.assertEquals("h1", m2.get("phx"));
Assert.assertEquals("h2", m2.get("slc"));
Assert.assertEquals("h3", m2.get("vs"));
Map<String, String> m3 = dcm.getDatacenterMachineMapping();
Assert.assertEquals("h2", m3.get("phx"));
Assert.assertEquals("h3", m3.get("slc"));
Assert.assertEquals("h0", m3.get("vs"));
Map<String, String> m4 = dcm.getDatacenterMachineMapping();
Assert.assertEquals("h3", m4.get("phx"));
Assert.assertEquals("h0", m4.get("slc"));
Assert.assertEquals("h1", m4.get("vs"));
Map<String, String> m5 = dcm.getDatacenterMachineMapping();
Assert.assertNull(m5.get("phx"));
Assert.assertNull(m5.get("slc"));
Assert.assertNull(m5.get("vs"));
}
关于java - 如何为每个数据中心选择备用机器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20029840/
为西欧、北美和日本提供服务的最佳 Microsoft Azure 数据中心是什么? Stack Overflow 警告我,我的问题似乎很主观,所以让我具体说一下。按这些地区的人口加权计算,哪个数据中心
使用 DSE 4.8.6 (C* 2.1.13.1218) 当我尝试在新数据中心添加新节点时,引导/节点重建总是会因流错误而中断。 来自 system.log 的错误示例: ERROR [STREAM
大家好,我是独孤风,大数据流动的作者。 最近几个概念频繁出现在大家的视野内。 什么是数据管理,数据治理,数据中心,数据中台,数据湖? 他们之间又有怎么样的区别和联系呢? 这几
我在数据中心 A 上运行 Cassandra 1.2.6 集群,每个节点都有一个空间有限的固态驱动器(大约 50% 的磁盘空间是可用的)。 现在我需要以某种方式实现对每个节点进行自动备份的方法。理想情
我浏览了这个博客Azure SF vs Docker但并没有完全解答我的疑惑。我有本地 Docker 数据中心,我想将 Azure SF 插入其中。但我觉得 DDC 正在做与 Service Fabr
我觉得我在 Windows Server 2016 上收到了有关 Docker DataCenter 的混合信号。有一些关于它在 Windows 上 native 运行的注释,但情况是否如此?是否有任
我想将 Algolia 与 graph.cool 一起使用。当我在 Algolia 中创建新应用程序时,我应该选择哪个地区??如果我没记错的话,graph.cool 后端位于都柏林...欧洲(DE)或
我已将 Debian Amazon EC2 服务器从北弗吉尼亚迁移(实际上是复制)到 VPC 内的爱尔兰数据中心。 我一直在使用this python script很想晚上做自动EBS快照备份,但是由
我尝试将东亚地区(香港位置)的存储帐户异地复制到中国 Azure 数据中心(中国华北、中国东部),但在创建存储帐户异地复制时找不到中国数据中心. 你能告诉我该怎么做吗? 最佳答案 Can you pl
我必须限制对我的 Azure 应用程序服务的公共(public)访问,因此我在 Web 配置中实现了 IP 白名单。是否需要将 Azure 数据中心 IP 范围列入白名单?我的应用服务使用 Azure
在 MarkLogic Data Hub 中运行协调时,我发现一些记录没有被协调。这是因为在 content.sjs 中遇到了一个常见的“无效实体引用”错误。 XDMP-DOCENTITYREF: x
我在美国和欧洲的 Google App Engine 数据中心都部署了一个应用程序。 (我的应用程序我们和我的应用程序欧盟) 如何根据用户的位置将用户重定向到最近的数据中心?目标是获得最佳延迟。 法国
我的问题类似于Is there a way to automatically and programmatically download the latest IP ranges used by Mi
SetThreadAffinityMask() 允许为 64 个逻辑核心(处理器)设置关联掩码。但是,Windows 数据中心最多可以有 64 个 CPU,每个 CPU 都有很多内核(请参阅 here
我正在尝试使用 Terraform 在 Azure 上的 Windows Server 2012 R2 数据中心 VM 上构建 SQL Server 2014。 这就是我的模块的样子 module "
我是一名优秀的程序员,十分优秀!