created: 2021-03-29T06:34:29.000Z

FaaSでPrisma(DBMS)を使う際のドキュメント

PrismaのドキュメントにはFaaSで使う場合のアドバイスがいろいろ書いてあった。 あるあるな困りごとについてよくまとまっているのでメモ。

たとえば 「FaaSのプロセスがいくつもコネクションを張る必要はなく、またそれをするとスパイク時にDBMS側のリソースが枯渇するのでやめましょうね」というようなことが色々と書いてあった。

Serverless (FaaS): It's recommended to set the connection limit to 1 if you're not using an external connection pooler because each incoming request starts a short-lived Node.js process. This can cause the database connection pool to be quickly exhausted from a short spike in user traffic.

Container reuse

FaaSが呼ばれる時に、毎度コンテナが立ち上がるか再利用されるかを制御することができないという話。

Description

It is not guaranteed that subsequent nearby invocations of a function will hit the same container. AWS can choose to create a new container at any time.

Potential Solution

Code should assume the container to be stateless and create a connection only if it does not exist. Prisma Client JS already implements that logic.

Zombie connections

FaaSの処理が終了しても、コンテナ内でプロセスとコネクションが残ってしまってDBMSのリソースを消耗させてしまうという話。

Description

The containers that are marked to be removed and are not being reused still keep a connection open and can stay in that state for some time (unknown and not documented from AWS), this can lead to sub-optimal utilization of the DB connections

Potential Solution

One potential solution is to use a lower idle connection timeout. Another solution can be to clean up the idle connections in a separate service

タイムアウトの数値を少なくするという方法がある。

Database connection pool exhaustion

リクエストがスパイクして、FaaSのプロセスが多数同時に立ち上がるとDBMS側のリソースが枯渇するという話。

Description

Concurrent requests create multiple new connections to the database thereby exhausting the database's connection limit.

Potential Solution

Add a connection pooler, e.g. PgBouncer or limiting the serverless function concurrency to a number lower than the database's connection limit.

その他

GCP の Cloud Function で Prisma を動かすサンプルが公開されていた。

GCP allows deploying just the project and fetches the modules for the user. To generate the Prisma client, we use the npm postinstall hook. Using the gcp-build hook does not work, since Google regenerates node_modules after that hook is executed.

  "scripts": {
    "postinstall": "CI=1 && PRISMA_TELEMETRY_INFORMATION='e2e-tests platforms/gcp-functions postinstall' && yarn prisma generate"
  },