Cassandra Python 驱动程序可重现超时
Cassandra Python Driver Reproducible Timeouts
我们正在尝试将 Apache Cassandra 用于一个大型项目,并且我们有一个 Python 脚本可以运行 INSERT
对数据库集群的查询。
在测试脚本时,在开发人员笔记本电脑 (MacOSX) 上,它可以完美运行并毫无问题地执行所有 INSERT。
每次在生产机器(Linux)中运行时,它总是有一个:
cassandra.OperationTimedOut: errors={}, last_host=cassandra1.example.com
我们正在使用 DataStax Python Driver 并在创建集群时使用多个主机(cassandra1.example.com 和 cassandra2.example.com)。
两台计算机在网络方面具有相同类型和级别的访问权限(无防火墙等)。生产服务器与数据库的 ping 时间为 4 毫秒,而开发人员笔记本电脑的平均时间为 40-50。
有什么问题吗?
很可能 40-50 毫秒的网络延迟足以减慢脚本的速度,以至于在 运行 来自您的笔记本电脑时它不会使服务器过载。生产服务器离得更近,所以它们可以更快地发送垃圾邮件,并使它们过载。如果您尽可能快地发送垃圾邮件异步写入,您可能需要通过每隔一段时间检查一次结果或只是进行速率限制来限制它们。
问题已解决,解决方法如下:
我们有一个 Python Class 本质上用作对象。在初始化程序中,我们创建了集群并连接到它,然后使用 self.cluster
、self.session
等将 session/connection/cluster 变量作为属性传递。
后来,从这个Class中的一个方法,我们调用了self.session
的execute()
语句:
def executeQuery(self, id)
self.session.execute("INSERT INTO table (id) VALUES (" + str(id) + ");")
然后我们用一个空函数替换了对象初始值设定项,并将所有与 Cassandra 相关的函数放在 executeQuery()
方法中。问题已解决,没有发生超时。
我们正在尝试将 Apache Cassandra 用于一个大型项目,并且我们有一个 Python 脚本可以运行 INSERT
对数据库集群的查询。
在测试脚本时,在开发人员笔记本电脑 (MacOSX) 上,它可以完美运行并毫无问题地执行所有 INSERT。
每次在生产机器(Linux)中运行时,它总是有一个:
cassandra.OperationTimedOut: errors={}, last_host=cassandra1.example.com
我们正在使用 DataStax Python Driver 并在创建集群时使用多个主机(cassandra1.example.com 和 cassandra2.example.com)。
两台计算机在网络方面具有相同类型和级别的访问权限(无防火墙等)。生产服务器与数据库的 ping 时间为 4 毫秒,而开发人员笔记本电脑的平均时间为 40-50。
有什么问题吗?
很可能 40-50 毫秒的网络延迟足以减慢脚本的速度,以至于在 运行 来自您的笔记本电脑时它不会使服务器过载。生产服务器离得更近,所以它们可以更快地发送垃圾邮件,并使它们过载。如果您尽可能快地发送垃圾邮件异步写入,您可能需要通过每隔一段时间检查一次结果或只是进行速率限制来限制它们。
问题已解决,解决方法如下:
我们有一个 Python Class 本质上用作对象。在初始化程序中,我们创建了集群并连接到它,然后使用 self.cluster
、self.session
等将 session/connection/cluster 变量作为属性传递。
后来,从这个Class中的一个方法,我们调用了self.session
的execute()
语句:
def executeQuery(self, id)
self.session.execute("INSERT INTO table (id) VALUES (" + str(id) + ");")
然后我们用一个空函数替换了对象初始值设定项,并将所有与 Cassandra 相关的函数放在 executeQuery()
方法中。问题已解决,没有发生超时。