Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: use pure ASGI middlewares #145

Merged
merged 12 commits into from
Jun 25, 2024
Merged

Conversation

alixlahuec
Copy link
Contributor

@alixlahuec alixlahuec commented Jun 21, 2024

Problem

When using multiple sessions, we've seen sporadic issues coming from the injected middlewares where the response body is missing, causing errors due to a mismatch with the promised Content-Length. We've also observed a significant increase in endpoint latency.

Besides, the middleware class we're using, BaseHTTPMiddleware, is no longer the recommended way of writing middlewares for Starlette. It's known to have functional issues and does not scale well (see discussion on this FastAPI issue, discussion on this Starlette issue, and this performance benchmark).

Solution

Refactor the middleware used to inject sessions into the request, to be pure ASGI middleware.

Related

Validation

✅ Tests are passing
✅ ER smoke tests with 2 sessions - calls are successful, both middlewares are present and executed (sample request - only the default session is used, sample request - both sessions are used)

@alixlahuec alixlahuec marked this pull request as ready for review June 21, 2024 19:58
Copy link

codecov bot commented Jun 25, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 100.00%. Comparing base (a7cc121) to head (8ec440c).

Additional details and impacted files
@@            Coverage Diff            @@
##            master      #145   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files           10        10           
  Lines          487       519   +32     
  Branches        71        77    +6     
=========================================
+ Hits           487       519   +32     
Flag Coverage Δ
.10-sqlalchemy1.4-pydantic1-asyncpg-aws_rds_iam 98.07% <100.00%> (+0.12%) ⬆️
.10-sqlalchemy1.4-pydantic1-asyncpg-noaws_rds_iam 97.10% <100.00%> (+0.18%) ⬆️
.10-sqlalchemy1.4-pydantic1-noasyncpg-aws_rds_iam 75.14% <57.74%> (-1.04%) ⬇️
.10-sqlalchemy1.4-pydantic1-noasyncpg-noaws_rds_iam 74.18% <57.74%> (-0.98%) ⬇️
.10-sqlalchemy1.4-pydantic2-asyncpg-aws_rds_iam 98.07% <100.00%> (+0.12%) ⬆️
.10-sqlalchemy1.4-pydantic2-asyncpg-noaws_rds_iam 97.10% <100.00%> (+0.18%) ⬆️
.10-sqlalchemy1.4-pydantic2-noasyncpg-aws_rds_iam 75.14% <57.74%> (-1.04%) ⬇️
.10-sqlalchemy1.4-pydantic2-noasyncpg-noaws_rds_iam 74.18% <57.74%> (-0.98%) ⬇️
.10-sqlalchemy2.0-pydantic1-asyncpg-aws_rds_iam 97.49% <100.00%> (+0.16%) ⬆️
.10-sqlalchemy2.0-pydantic1-asyncpg-noaws_rds_iam 96.53% <100.00%> (+0.22%) ⬆️
.10-sqlalchemy2.0-pydantic1-noasyncpg-aws_rds_iam 74.56% <57.74%> (-1.00%) ⬇️
.10-sqlalchemy2.0-pydantic1-noasyncpg-noaws_rds_iam 73.60% <57.74%> (-0.94%) ⬇️
.10-sqlalchemy2.0-pydantic2-asyncpg-aws_rds_iam 97.49% <100.00%> (+0.16%) ⬆️
.10-sqlalchemy2.0-pydantic2-asyncpg-noaws_rds_iam 96.53% <100.00%> (+0.22%) ⬆️
.10-sqlalchemy2.0-pydantic2-noasyncpg-aws_rds_iam 74.56% <57.74%> (-1.00%) ⬇️
.10-sqlalchemy2.0-pydantic2-noasyncpg-noaws_rds_iam 73.60% <57.74%> (-0.94%) ⬇️
.10-sqlalchemy2.0-sqlmodel-pydantic1-asyncpg-aws_rds_iam 97.10% <100.00%> (+0.18%) ⬆️
.10-sqlalchemy2.0-sqlmodel-pydantic1-asyncpg-noaws_rds_iam 96.14% <100.00%> (+0.25%) ⬆️
.10-sqlalchemy2.0-sqlmodel-pydantic1-noasyncpg-aws_rds_iam 74.18% <57.74%> (-0.98%) ⬇️
.10-sqlalchemy2.0-sqlmodel-pydantic1-noasyncpg-noaws_rds_iam 73.21% <57.74%> (-0.91%) ⬇️
.10-sqlalchemy2.0-sqlmodel-pydantic2-asyncpg-aws_rds_iam 97.10% <100.00%> (+0.18%) ⬆️
.10-sqlalchemy2.0-sqlmodel-pydantic2-asyncpg-noaws_rds_iam 96.14% <100.00%> (+0.25%) ⬆️
.10-sqlalchemy2.0-sqlmodel-pydantic2-noasyncpg-aws_rds_iam 74.18% <57.74%> (-0.98%) ⬇️
.10-sqlalchemy2.0-sqlmodel-pydantic2-noasyncpg-noaws_rds_iam 73.21% <57.74%> (-0.91%) ⬇️
.11-sqlalchemy1.4-pydantic1-asyncpg-aws_rds_iam 98.07% <100.00%> (+0.12%) ⬆️
.11-sqlalchemy1.4-pydantic1-asyncpg-noaws_rds_iam 97.10% <100.00%> (+0.18%) ⬆️
.11-sqlalchemy1.4-pydantic1-noasyncpg-aws_rds_iam 75.14% <57.74%> (-1.04%) ⬇️
.11-sqlalchemy1.4-pydantic1-noasyncpg-noaws_rds_iam 74.18% <57.74%> (-0.98%) ⬇️
.11-sqlalchemy1.4-pydantic2-asyncpg-aws_rds_iam 98.07% <100.00%> (+0.12%) ⬆️
.11-sqlalchemy1.4-pydantic2-asyncpg-noaws_rds_iam 97.10% <100.00%> (+0.18%) ⬆️
.11-sqlalchemy1.4-pydantic2-noasyncpg-aws_rds_iam 75.14% <57.74%> (-1.04%) ⬇️
.11-sqlalchemy1.4-pydantic2-noasyncpg-noaws_rds_iam 74.18% <57.74%> (-0.98%) ⬇️
.11-sqlalchemy2.0-pydantic1-asyncpg-aws_rds_iam 97.49% <100.00%> (+0.16%) ⬆️
.11-sqlalchemy2.0-pydantic1-asyncpg-noaws_rds_iam 96.53% <100.00%> (+0.22%) ⬆️
.11-sqlalchemy2.0-pydantic1-noasyncpg-aws_rds_iam 74.56% <57.74%> (-1.00%) ⬇️
.11-sqlalchemy2.0-pydantic1-noasyncpg-noaws_rds_iam 73.60% <57.74%> (-0.94%) ⬇️
.11-sqlalchemy2.0-pydantic2-asyncpg-aws_rds_iam 97.49% <100.00%> (+0.16%) ⬆️
.11-sqlalchemy2.0-pydantic2-asyncpg-noaws_rds_iam 96.53% <100.00%> (+0.22%) ⬆️
.11-sqlalchemy2.0-pydantic2-noasyncpg-aws_rds_iam 74.56% <57.74%> (-1.00%) ⬇️
.11-sqlalchemy2.0-pydantic2-noasyncpg-noaws_rds_iam 73.60% <57.74%> (-0.94%) ⬇️
.11-sqlalchemy2.0-sqlmodel-pydantic1-asyncpg-aws_rds_iam 97.10% <100.00%> (+0.18%) ⬆️
.11-sqlalchemy2.0-sqlmodel-pydantic1-asyncpg-noaws_rds_iam 96.14% <100.00%> (+0.25%) ⬆️
.11-sqlalchemy2.0-sqlmodel-pydantic1-noasyncpg-aws_rds_iam 74.18% <57.74%> (-0.98%) ⬇️
.11-sqlalchemy2.0-sqlmodel-pydantic1-noasyncpg-noaws_rds_iam 73.21% <57.74%> (-0.91%) ⬇️
.11-sqlalchemy2.0-sqlmodel-pydantic2-asyncpg-aws_rds_iam 97.10% <100.00%> (+0.18%) ⬆️
.11-sqlalchemy2.0-sqlmodel-pydantic2-asyncpg-noaws_rds_iam 96.14% <100.00%> (+0.25%) ⬆️
.11-sqlalchemy2.0-sqlmodel-pydantic2-noasyncpg-aws_rds_iam 74.18% <57.74%> (-0.98%) ⬇️
.11-sqlalchemy2.0-sqlmodel-pydantic2-noasyncpg-noaws_rds_iam 73.21% <57.74%> (-0.91%) ⬇️
.12-sqlalchemy1.4-pydantic1-asyncpg-aws_rds_iam 98.07% <100.00%> (+0.12%) ⬆️
.12-sqlalchemy1.4-pydantic1-asyncpg-noaws_rds_iam 97.10% <100.00%> (+0.18%) ⬆️
.12-sqlalchemy1.4-pydantic1-noasyncpg-aws_rds_iam 75.14% <57.74%> (-1.04%) ⬇️
.12-sqlalchemy1.4-pydantic1-noasyncpg-noaws_rds_iam 74.18% <57.74%> (-0.98%) ⬇️
.12-sqlalchemy1.4-pydantic2-asyncpg-aws_rds_iam 98.07% <100.00%> (+0.12%) ⬆️
.12-sqlalchemy1.4-pydantic2-asyncpg-noaws_rds_iam 97.10% <100.00%> (+0.18%) ⬆️
.12-sqlalchemy1.4-pydantic2-noasyncpg-aws_rds_iam 75.14% <57.74%> (-1.04%) ⬇️
.12-sqlalchemy1.4-pydantic2-noasyncpg-noaws_rds_iam 74.18% <57.74%> (-0.98%) ⬇️
.12-sqlalchemy2.0-pydantic1-asyncpg-aws_rds_iam 97.49% <100.00%> (+0.16%) ⬆️
.12-sqlalchemy2.0-pydantic1-asyncpg-noaws_rds_iam 96.53% <100.00%> (+0.22%) ⬆️
.12-sqlalchemy2.0-pydantic1-noasyncpg-aws_rds_iam 74.56% <57.74%> (-1.00%) ⬇️
.12-sqlalchemy2.0-pydantic1-noasyncpg-noaws_rds_iam 73.60% <57.74%> (-0.94%) ⬇️
.12-sqlalchemy2.0-pydantic2-asyncpg-aws_rds_iam 97.49% <100.00%> (+0.16%) ⬆️
.12-sqlalchemy2.0-pydantic2-asyncpg-noaws_rds_iam 96.53% <100.00%> (+0.22%) ⬆️
.12-sqlalchemy2.0-pydantic2-noasyncpg-aws_rds_iam 74.56% <57.74%> (-1.00%) ⬇️
.12-sqlalchemy2.0-pydantic2-noasyncpg-noaws_rds_iam 73.60% <57.74%> (-0.94%) ⬇️
.12-sqlalchemy2.0-sqlmodel-pydantic1-asyncpg-aws_rds_iam 97.10% <100.00%> (+0.18%) ⬆️
.12-sqlalchemy2.0-sqlmodel-pydantic1-asyncpg-noaws_rds_iam 96.14% <100.00%> (+0.25%) ⬆️
.12-sqlalchemy2.0-sqlmodel-pydantic1-noasyncpg-aws_rds_iam 74.18% <57.74%> (-0.98%) ⬇️
.12-sqlalchemy2.0-sqlmodel-pydantic1-noasyncpg-noaws_rds_iam 73.21% <57.74%> (-0.91%) ⬇️
.12-sqlalchemy2.0-sqlmodel-pydantic2-asyncpg-aws_rds_iam 97.10% <100.00%> (+0.18%) ⬆️
.12-sqlalchemy2.0-sqlmodel-pydantic2-asyncpg-noaws_rds_iam 96.14% <100.00%> (+0.25%) ⬆️
.12-sqlalchemy2.0-sqlmodel-pydantic2-noasyncpg-aws_rds_iam 74.18% <57.74%> (-0.98%) ⬇️
.12-sqlalchemy2.0-sqlmodel-pydantic2-noasyncpg-noaws_rds_iam 73.21% <57.74%> (-0.91%) ⬇️
.9-sqlalchemy1.4-pydantic1-asyncpg-aws_rds_iam 98.07% <100.00%> (+0.12%) ⬆️
.9-sqlalchemy1.4-pydantic1-asyncpg-noaws_rds_iam 97.10% <100.00%> (+0.18%) ⬆️
.9-sqlalchemy1.4-pydantic1-noasyncpg-aws_rds_iam 75.14% <57.74%> (-1.04%) ⬇️
.9-sqlalchemy1.4-pydantic1-noasyncpg-noaws_rds_iam 74.18% <57.74%> (-0.98%) ⬇️
.9-sqlalchemy1.4-pydantic2-asyncpg-aws_rds_iam 98.07% <100.00%> (+0.12%) ⬆️
.9-sqlalchemy1.4-pydantic2-asyncpg-noaws_rds_iam 97.10% <100.00%> (+0.18%) ⬆️
.9-sqlalchemy1.4-pydantic2-noasyncpg-aws_rds_iam 75.14% <57.74%> (-1.04%) ⬇️
.9-sqlalchemy1.4-pydantic2-noasyncpg-noaws_rds_iam 74.18% <57.74%> (-0.98%) ⬇️
.9-sqlalchemy2.0-pydantic1-asyncpg-aws_rds_iam 97.49% <100.00%> (+0.16%) ⬆️
.9-sqlalchemy2.0-pydantic1-asyncpg-noaws_rds_iam 96.53% <100.00%> (+0.22%) ⬆️
.9-sqlalchemy2.0-pydantic1-noasyncpg-aws_rds_iam 74.56% <57.74%> (-1.00%) ⬇️
.9-sqlalchemy2.0-pydantic1-noasyncpg-noaws_rds_iam 73.60% <57.74%> (-0.94%) ⬇️
.9-sqlalchemy2.0-pydantic2-asyncpg-aws_rds_iam 97.49% <100.00%> (+0.16%) ⬆️
.9-sqlalchemy2.0-pydantic2-asyncpg-noaws_rds_iam 96.53% <100.00%> (+0.22%) ⬆️
.9-sqlalchemy2.0-pydantic2-noasyncpg-aws_rds_iam 74.56% <57.74%> (-1.00%) ⬇️
.9-sqlalchemy2.0-pydantic2-noasyncpg-noaws_rds_iam 73.60% <57.74%> (-0.94%) ⬇️
.9-sqlalchemy2.0-sqlmodel-pydantic1-asyncpg-aws_rds_iam 97.10% <100.00%> (+0.18%) ⬆️
.9-sqlalchemy2.0-sqlmodel-pydantic1-asyncpg-noaws_rds_iam 96.14% <100.00%> (+0.25%) ⬆️
.9-sqlalchemy2.0-sqlmodel-pydantic1-noasyncpg-aws_rds_iam 74.18% <57.74%> (-0.98%) ⬇️
.9-sqlalchemy2.0-sqlmodel-pydantic1-noasyncpg-noaws_rds_iam 73.21% <57.74%> (-0.91%) ⬇️
.9-sqlalchemy2.0-sqlmodel-pydantic2-asyncpg-aws_rds_iam 97.10% <100.00%> (+0.18%) ⬆️
.9-sqlalchemy2.0-sqlmodel-pydantic2-asyncpg-noaws_rds_iam 96.14% <100.00%> (+0.25%) ⬆️
.9-sqlalchemy2.0-sqlmodel-pydantic2-noasyncpg-aws_rds_iam 74.18% <57.74%> (-0.98%) ⬇️
.9-sqlalchemy2.0-sqlmodel-pydantic2-noasyncpg-noaws_rds_iam 73.21% <57.74%> (-0.91%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

Copy link
Contributor

@arththebird arththebird left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Very nice! 🙌

@alixlahuec
Copy link
Contributor Author

✅ Did a final smoke test with ER, with both sessions & read/writes 🚀

@alixlahuec alixlahuec merged commit 788264e into master Jun 25, 2024
3 checks passed
@alixlahuec alixlahuec deleted the feat/refactor-middlewares branch June 25, 2024 17:49
@hadrien
Copy link
Contributor

hadrien commented Jan 16, 2025

FWIW, when I started this lib, I initially wrote a fastapi dependency to handle the sqla session.

But there was a bug/flaw in fastapi (fastapi/fastapi#869).

Therefore, @vicrep and I went with a middleware instead.

Today, that fastapi bug/flaw has been fixed: I strongly recommend ditching the middleware in favour of a simpler fastapi dependency.

(FWIW, I wrote an async only fastapi sqla lib which illustrates my thought-> https://github.com/hadrien/fastapi-async-sqla )

@arththebird
Copy link
Contributor

FWIW, when I started this lib, I initially wrote a fastapi dependency to handle the sqla session.

But there was a bug/flaw in fastapi (fastapi/fastapi#869).

Therefore, @vicrep and I went with a middleware instead.

Today, that fastapi bug/flaw has been fixed: I strongly recommend ditching the middleware in favour of a simpler fastapi dependency.

(FWIW, I wrote an async only fastapi sqla lib which illustrates my thought-> https://github.com/hadrien/fastapi-async-sqla )

Thanks for flagging, we'll look into this!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging this pull request may close these issues.

3 participants