客户端,Google Flex App Engine和Cloud SQL之间的高延迟

时间:2018-06-14 13:26:16

标签: python google-app-engine flask google-cloud-sql app-engine-flexible

我有一个Google Flex App Engine应用程序,它接收带有JSON数据的POST,然后使用SQLAlchemy执行插入语句,该语句将JSON数据写入Cloud SQL数据库。 POST设备(在达拉斯)和App Engine(us-east)之间的延迟远远超过300毫秒,有时超过1500毫秒。我相信这可能是因为INSERT写入速度不佳,尽管负载很难“荒谬”或者其他任何东西。大约高达5-8读/秒和150-300写/秒

使用Flask,SQLAlchemy,MySQL 5.6(在Cloud SQL上)和第二代Google Flex App Engine实例。

我的问题是我需要减少延迟,我无法弄清楚导致它的原因。我已经运行traceroute和ping命令到IP,将json数据发送到由Google App Engine托管的Flask App页面。 ping很好,一跳就有打嗝,但只有一个区域。如果我的延迟太高,IP可能会丢失POST。

from api import app
from sqlalchemy import create_engine
from datetime import datetime, timedelta

engine = create_engine(app.config.get("database_uri"))

Class Events(object):
    @staticmethod
    def add(event):
        connection = engine.connect()
        for observation in event["observations"]:
            try:
                connection.execute("""INSERT INTO events (
                    ...
                ) VALUES (
                    %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s
                )""", (
                    ...
                ))
            except Exception as ex:
                print(ex)
        connection.close()

这是由:

触发的
@app.route('/', methods=['POST'])
def events_post():
    data = request.json
    if data["secret"] != app.config.get("secret"):
        return
    Events.add(data["data"])
    return "Success"

我最后尝试过使用和不使用connection.close(),这似乎并不重要。这是一个稳定的数据流,因此每次关闭和重新打开连接对于手头的工作来说似乎都是资源密集型。

提前致谢。

1 个答案:

答案 0 :(得分:0)

如先前注释中所建议,您需要查看Stackdriver上的日志。 特别是Cloud SQL实例操作日志或MySQL错误日志。这将使您了解需要进行哪些微调才能提高查询性能。如您所述,这可能是由于INSERT写入速度不佳所致,确认此操作的唯一方法是过滤日志。

对于第二代Google App Engine Flex实例,延迟受编写器和数据库位置sending data a long distance introduces latency的影响。您的Cloud SQL实例与App Engine应用程序之间的距离越大,导致与数据库的连接的延迟就越大。

请查看此documentation,当您从App Engine Flex for Python应用程序连接到Cloud SQL时,它可以帮助您配置应用程序以更好地扩展。

我希望这有助于回答您的问题。