我需要一个组件/类来限制某些方法的执行到N秒内的最大M次调用(或ms或nanos,无关紧要).
换句话说,我需要确保我的方法在N秒的滑动窗口中执行不超过M次.
如果您不知道现有的课程,请随时发布您的解决方案/想法如何实现这一点.
阻止从com.datastax.driver.core.Session执行fethod
public ResultSet execute(Statement statement);
Run Code Online (Sandbox Code Playgroud)
评论这种方法:
该方法阻塞,直到从数据库接收到至少一些结果.但是,对于SELECT查询,它不保证已完全接收结果.但它确实保证从数据库收到了一些响应,特别是保证如果请求无效,则此方法将抛出异常.
来自com.datastax.driver.core.Session的非阻塞执行方法
public ResultSetFuture executeAsync(Statement statement);
Run Code Online (Sandbox Code Playgroud)
此方法不会阻止.一旦查询传递到底层网络堆栈,它就会返回.特别是,从此方法返回并不保证查询有效或甚至已提交到活动节点.访问{@link ResultSetFuture}时,将抛出与查询失败有关的任何异常.
我有关于它们的02个问题,因此如果你能帮我理解它们会很棒.
假设我有100万条记录,我希望所有这些记录都能到达数据库(没有丢失).
问题1:如果我有n个线程,则所有线程将具有发送到数据库所需的相同数量的记录.所有这些都继续使用阻塞执行调用向cassandra发送多个插入查询.如果我增加n的值,它是否也有助于加快我需要将所有记录插入cassandra的时间?
这会导致cassandra的性能问题吗?Cassandra是否必须确保对于每个插入记录,群集中的所有节点都应立即知道新记录?为了保持数据的一致性.(我假设cassandra节点甚至不会考虑使用本地机器时间来控制记录插入时间).
问题2:通过非阻塞执行,我如何确保所有插入成功?我知道的唯一方法是等待ResultSetFuture检查插入查询的执行.有什么更好的办法吗?非阻塞执行更容易失败然后阻塞执行的可能性更高吗?
非常感谢您的帮助.