对于我当前的项目,我们决定将我们的应用程序部署到一些 Linux 机器上的亚马逊弹性计算云。我们使用 JGroups 进行组通信,并且需要一种可靠的发现机制,该机制不需要使用其他集群成员的地址预先配置每个应用程序(这对于 TCPPING 是必需的,而对于 TCPGOSSIP 则“排序”是必需的)。由于我们不能使用 UDP 多播,因此我们的选项中排除了多播发现。
我们研究过使用 S3 Ping 协议,但在得知它存在一些可靠性问题后,我们决定推出自己的协议来完成这一发现。
我很想得到一些关于我们编写的简单协议的反馈,以及它与 S3 Ping 的比较。它目前的一个限制是它依赖于适用于 Java 的 AWS 开发工具包。
public class EC2Ping extends Discovery {
private static final Logger log = LoggerFactory.getLogger(EC2Ping.class);
public static final short EC2_PING_PROTOCOL_ID = 1001;
private static final int DEFAULT_JGROUPS_PORT = 7800;
static {
ClassConfigurator.addProtocol(EC2_PING_PROTOCOL_ID, EC2Ping.class);
}
/** The JGroups port number */
private int port = DEFAULT_JGROUPS_PORT;
/** The EC2 client */
private AmazonEC2Client client;
/** The EC2 instance filters */
private List<Filter> filters;
public EC2Ping(EC2Ping src) {
this.client = src.client;
this.port = src.port;
}
public EC2Ping() {
// Default constructor
}
@Required
public void setClient(AmazonEC2Client client) {
this.client = client;
}
public void setFilters(List<Filter> filters) {
this.filters = filters;
}
public void setPort(int port) {
this.port = port;
}
public int getPort() {
return port;
}
@Override
public Collection<PhysicalAddress> fetchClusterMembers(String cluster_name) {
List<PhysicalAddress> addresses = new ArrayList<PhysicalAddress>();
DescribeInstancesRequest request = new DescribeInstancesRequest();
if (filters != null) {
request.setFilters(filters);
}
DescribeInstancesResult result = client.describeInstances(request);
for (Reservation res : result.getReservations()) {
for (Instance instance : res.getInstances()) {
String ipAddr = instance.getPrivateIpAddress();
IpAddress addr;
try {
addr = new IpAddress(ipAddr, port);
addresses.add(addr);
} catch (UnknownHostException uhe) {
log.error("Unable to resolve cluster member address [" + ipAddr + "]");
}
}
}
return addresses;
}
@Override
public boolean isDynamic() {
return true;
}
@Override
public boolean sendDiscoveryRequestsInParallel() {
return true;
}
}
如有必要,我可以包含我的协议栈配置,但它与 UDP 非常相似,只是它使用我们的 EC2Ping 协议而不是多播发现。
我的主要问题如下:
- 这是否提供了比 S3 Ping 更可靠的解决方案?
- 对 AWS Java 开发工具包的依赖是否否定了该解决方案的实用性?(在回馈 JGroups 方面)
任何意见将不胜感激。谢谢