我们正试图用AWS Keyspace替换现有的Cassandra EC2集群,并试图保留我们的旧代码库。这个想法是简单地退出devops业务,让我们的Cassandra由AWS管理(扩展、升级等(。查看他们提供的指南
https://docs.aws.amazon.com/keyspaces/latest/devguide/using_java_driver.html
他们使用的驱动程序与我们目前使用的不同(更新(:
我们目前的驱动程序:
<dependency>
<groupId>com.datastax.cassandra</groupId>
<artifactId>cassandra-driver-core</artifactId>
<version>3.3.0</version>
</dependency>
他们的例子:
<dependency>
<groupId>com.datastax.oss</groupId>
<artifactId>java-driver-core</artifactId>
<version>4.4.0</version>
</dependency>
代码示例似乎与我们现有的代码完全不同。
问题-是否有人使用旧的驱动程序和旧代码成功迁移到AWS密钥空间?或者这需要升级吗?我的犹豫是,我们有很多代码,考虑到重构的成本,放弃Cassandra并重新开始其他东西(DynamoDB、MongoDB等(可能会更容易
AmazonKeyspaces可以非常简单地使用3.x驱动程序。虽然4.x驱动程序有一些好处,比如外部化配置,但不需要升级来移动AmazonKeyspaces。
您可以使用传统的用户名/名称密码验证或sigv4插件。
<!-- https://mvnrepository.com/artifact/software.aws.mcs/aws-sigv4-auth-cassandra-java-driver-plugin -->
<dependency>
<groupId>software.aws.mcs</groupId>
<artifactId>aws-sigv4-auth-cassandra-java-driver-plugin_3</artifactId>
<version>3.0.3</version>
</dependency>
连接java3.x并写入密钥空间的代码示例。
import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.Session;
import com.datastax.driver.core.PreparedStatement;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.Row;
import software.aws.mcs.auth.SigV4AuthProvider;
import java.net.InetSocketAddress;
import java.util.Collections;
import java.util.List;
public class OrderFetcher {
public final static String TABLE_FORMAT = "%-25s%sn";
public final static int KEYSPACES_PORT = 9142;
public static Cluster connectToCluster(String region, List<InetSocketAddress> contactPoints) {
SigV4AuthProvider provider = new SigV4AuthProvider(region);
return Cluster.builder()
.addContactPointsWithPorts(contactPoints)
.withPort(KEYSPACES_PORT)
.withAuthProvider(provider)
.withSSL()
.build();
}
public static void main(String[] args) {
if (args.length != 3) {
System.err.println("Usage: OrderFetcher <region> <endpoint> <customer ID>");
System.exit(1);
}
String region = args[0];
List<InetSocketAddress> contactPoints = Collections.singletonList(new InetSocketAddress(args[1], KEYSPACES_PORT));
try (Cluster cluster = connectToCluster(region, contactPoints)) {
Session session = cluster.connect();
// Use a prepared query for quoting
PreparedStatement prepared = session.prepare("select * from acme.orders where customer_id = ?");
// We use execute to send a query to Cassandra. This returns a ResultSet, which is essentially a collection
// of Row objects.
ResultSet rs = session.execute(prepared.bind(args[2]));
// Print the header
System.out.printf(TABLE_FORMAT, "Date", "Order Id");
for (Row row : rs) {
System.out.printf(TABLE_FORMAT, row.getTimestamp("order_timestamp"), row.getUUID("order_id"));
}
}
}
}
以下是github 示例的链接
https://github.com/aws-samples/amazon-keyspaces-examples/blob/main/java/datastax-v3/connection-sigv4/src/main/java/software/aws/mcs/example/OrderFetcher.java