ΠΠΎΠ³Π΄Π° Π½ΡΠΆΠ½Π° ΠΏΠΎΠΌΠΎΡΡ ΡΠΎ ΡΠ½ΠΈΠΆΠ΅Π½ΠΈΠ΅ΠΌ p95 latency?
ΠΡΡΠΎΠΊΠ°Ρ p95 latency (Π²ΡΠ΅ΠΌΡ ΠΎΡΠ²Π΅ΡΠ°, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΡΠ΅Π²ΡΡΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ 5% Π·Π°ΠΏΡΠΎΡΠΎΠ²) ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΊΡΠΈΡΠΈΡΠ½ΡΠΌ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΌ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡΡ. ΠΡΠ»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ ΡΡΠ°Π»ΠΊΠΈΠ²Π°ΡΡΡΡ Ρ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠΉ Π·Π°Π³ΡΡΠ·ΠΊΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡ ΠΈΠ»ΠΈ Π·Π°Π΄Π΅ΡΠΆΠΊΠ°ΠΌΠΈ, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π½Π΅Π³Π°ΡΠΈΠ²Π½ΠΎ ΡΠΊΠ°Π·Π°ΡΡΡΡ Π½Π° ΠΈΡ
ΠΎΠΏΡΡΠ΅, Π° ΡΠ°ΠΊΠΆΠ΅ Π½Π° ΠΌΠ΅ΡΡΠΈΠΊΠ°Ρ
Π±ΠΈΠ·Π½Π΅ΡΠ°. ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΏΡΠΈΡΠΈΠ½Ρ Π²ΡΡΠΎΠΊΠΎΠΉ p95 latency Π² Django-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ
ΡΠ°ΡΡΠΎ ΡΠ²ΡΠ·Π°Π½Ρ Ρ Π½Π΅ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΌΠΈ Π·Π°ΠΏΡΠΎΡΠ°ΠΌΠΈ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ
(N+1), ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ΠΌ ΠΊΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ΠΌ Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΡΠΆΠ΅Π»ΡΡ
Π·Π°Π΄Π°Ρ.
ΠΠΎΠΉ ΡΠ΅Ρ
Π½ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄
Π― Π½Π°ΡΠΈΠ½Π°Ρ Ρ Π³Π»ΡΠ±ΠΎΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΡΡΠΎΠ±Ρ Π²ΡΡΠ²ΠΈΡΡ ΡΠ·ΠΊΠΈΠ΅ ΠΌΠ΅ΡΡΠ°. ΠΠ±ΡΡΠ½ΠΎ Ρ ΡΠΎΠΊΡΡΠΈΡΡΡΡΡ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΡ
ΠΎΠ±Π»Π°ΡΡΡΡ
:
1. ΠΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΠΈ ΡΡΡΡΠ°Π½Π΅Π½ΠΈΠ΅ N+1 Π·Π°ΠΏΡΠΎΡΠΎΠ²
N+1 Π·Π°ΠΏΡΠΎΡΡ β ΠΎΠ΄Π½Π° ΠΈΠ· ΡΠ°ΠΌΡΡ
ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½ΡΡ
ΠΏΡΠΈΡΠΈΠ½ Π²ΡΡΠΎΠΊΠΎΠΉ latency. ΠΠ½ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡ, ΠΊΠΎΠ³Π΄Π° Π²ΠΌΠ΅ΡΡΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π·Π°ΠΏΡΠΎΡΠ° ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ
Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ
Π·Π°ΠΏΡΠΎΡΠΎΠ² Π΄Π»Ρ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΡ ΡΠ²ΡΠ·Π°Π½Π½ΡΡ
Π΄Π°Π½Π½ΡΡ
. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ ORM Π² Django ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΡΠ°ΠΊ:
for author in Author.objects.all():
books = author.book_set.all()
for book in books:
print(book.title)
Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π°Π²ΡΠΎΡΠ° Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ Π·Π°ΠΏΡΠΎΡ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ
Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ²ΡΠ·Π°Π½Π½ΡΡ
ΠΊΠ½ΠΈΠ³. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ ΡΠΎΡΠ½ΡΠΌ ΠΈΠ»ΠΈ ΡΡΡΡΡΠ°ΠΌ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΏΡΠΈ Π±ΠΎΠ»ΡΡΠΎΠΌ ΠΎΠ±ΡΠ΅ΠΌΠ΅ Π΄Π°Π½Π½ΡΡ
.
ΠΠ»Ρ Π²ΡΡΠ²Π»Π΅Π½ΠΈΡ ΡΠ°ΠΊΠΈΡ
ΠΌΠ΅ΡΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΏΡΠΎΡΠ°ΠΉΠ»Π΅ΡΡ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Django Debug Toolbar ΠΈΠ»ΠΈ django-silk. ΠΡΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΡΠ²ΠΈΠ΄Π΅ΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π² ΡΠ°ΠΌΠΊΠ°Ρ
ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ HTTP-Π·Π°ΠΏΡΠΎΡΠ°. ΠΠΎΡΠ»Π΅ Π²ΡΡΠ²Π»Π΅Π½ΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½ΡΡ
ΠΌΠ΅ΡΡ Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΡΡ ΠΊΠΎΠ΄ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ select_related() ΠΈ prefetch_related(). ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
authors = Author.objects.prefetch_related('book_set').all()
for author in authors:
for book in author.book_set.all():
print(book.title)
ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠΎΠΊΡΠ°ΡΠΈΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π°ΠΏΡΠΎΡΠΎΠ², ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΡ ΠΈΡ
Π² ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ
Π·Π°ΠΏΡΠΎΡΠΎΠ².
Π§Π°ΡΡΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΏΡΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ N+1
- ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅
select_related() Π΄Π»Ρ ΠΏΠΎΠ»Π΅ΠΉ Ρ ManyToMany ΡΠ²ΡΠ·ΡΠΌΠΈ, ΡΡΠΎ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΠΎΡΠΈΠ±ΠΊΠ°ΠΌ. ΠΠ»Ρ ΡΠ°ΠΊΠΈΡ
ΡΠ»ΡΡΠ°Π΅Π² Π»ΡΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ prefetch_related().
- ΠΡΠ΅Π½Π΅Π±ΡΠ΅ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΎΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ² ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ. ΠΠΎΡΠ»Π΅ Π²Π½Π΅ΡΠ΅Π½ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΏΡΠΎΡΠ°ΠΉΠ»Π΅Ρ, ΡΡΠΎΠ±Ρ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ΅ΡΠ΅Π½Π°.
- ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² Π±Π΅Π· ΡΡΠ΅ΡΠ° ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ² Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ
. ΠΠ°ΠΆΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π·Π°ΠΏΡΠΎΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΡΠΌ, Π΅ΡΠ»ΠΈ ΠΎΡΡΡΡΡΡΠ²ΡΡΡ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΡ.
2. ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ΅ΡΠ΅ΠΉ
ΠΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ β ΡΡΠΎ ΠΌΠΎΡΠ½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΄Π»Ρ ΡΠ½ΠΈΠΆΠ΅Π½ΠΈΡ p95 latency, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π΄Π»Ρ Π΄Π°Π½Π½ΡΡ
, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ°ΡΡΠΎ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°ΡΡΡΡ ΠΈ ΡΠ΅Π΄ΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡΡΡ. Π Django Π΅ΡΡΡ Π²ΡΡΡΠΎΠ΅Π½Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
Π±Π΅ΠΊΠ΅Π½Π΄ΠΎΠ² ΠΊΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΡΠ°ΠΊΠΈΡ
ΠΊΠ°ΠΊ Memcached ΠΈ Redis. Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΊΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΡΡΠΎΠ²Π½ΡΡ
:
ΠΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΠΎΠ²
ΠΠ»Ρ ΡΠ»ΠΎΠΆΠ½ΡΡ
Π·Π°ΠΏΡΠΎΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΡΠ°ΡΡΠΎ, Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΊΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΠΎΠ². ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
from django.core.cache import cache
def get_expensive_query_result():
cache_key = "expensive_query_result"
result = cache.get(cache_key)
if result is None:
result = MyModel.objects.filter(...).annotate(...).values(...)
cache.set(cache_key, result, timeout=3600)
return result
ΠΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ²
ΠΠ»Ρ ΡΡΡΠ°Π½ΠΈΡ Ρ ΡΡΠΆΠ΅Π»ΡΠΌ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³ΠΎΠΌ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ°ΡΠ½ΠΎΠ΅ ΠΊΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅:
{% load cache %}
{% cache 600 some_unique_key %}
{% endcache %}
ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠ³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠ»ΠΎΠΆΠ½ΡΡ
ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΡΡΠ°Π½ΠΈΡΡ.
Π§Π°ΡΡΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠ΅ΡΠ΅ΠΉ
- ΠΡΠΎΠΏΡΡΠΊ ΠΎΡΠΈΡΡΠΊΠΈ ΠΊΠ΅ΡΠ° ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π΄Π°Π½Π½ΡΡ
. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ Π΄Π°Π½Π½ΡΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡΡΡ, Π½ΠΎ ΠΊΠ΅Ρ Π½Π΅ ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΡΡΡ, ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ ΠΌΠΎΠ³ΡΡ Π²ΠΈΠ΄Π΅ΡΡ ΡΡΡΠ°ΡΠ΅Π²ΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ.
- ΠΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ
, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ°ΡΡΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡΡΡ, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΡ Π½Π°Π³ΡΡΠ·ΠΊΠΈ Π½Π° ΡΠΈΡΡΠ΅ΠΌΡ ΠΈΠ·-Π·Π° ΡΠ°ΡΡΠΎΠ³ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΊΠ΅ΡΠ°.
- ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΊΠΎΡΠΎΡΠΊΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΆΠΈΠ·Π½ΠΈ ΠΊΠ΅ΡΠ° (
timeout), ΡΡΠΎ ΡΠ½ΠΈΠΆΠ°Π΅Ρ Π΅Π³ΠΎ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ.
3. ΠΡΠ½ΠΎΡ ΡΡΠΆΠ΅Π»ΡΡ
Π·Π°Π΄Π°Ρ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ
ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΎΡΠΏΡΠ°Π²ΠΊΠ° email, ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ ΠΈΠ»ΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ Π²Π½Π΅ΡΠ½ΠΈΠΌΠΈ API, ΠΌΠΎΠ³ΡΡ Π·Π°Π½ΠΈΠΌΠ°ΡΡ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ. ΠΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΠ°ΠΊΠΈΡ
Π·Π°Π΄Π°Ρ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π·Π°ΠΏΡΠΎΡΠ° ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅Ρ p95 latency. ΠΠ»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Π·Π°Π΄Π°Ρ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Celery, Π² ΡΠΎΡΠ΅ΡΠ°Π½ΠΈΠΈ Ρ Π±ΡΠΎΠΊΠ΅ΡΠ°ΠΌΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ RabbitMQ ΠΈΠ»ΠΈ Redis.
ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Celery
ΠΡΠΎΡΡΠ΅ΠΉΡΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π°Π΄Π°ΡΠΈ:
from celery import shared_task
@shared_task
def send_email_task(email_address):
# ΠΠΎΠ³ΠΈΠΊΠ° ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ email
pass
ΠΡΡ Π·Π°Π΄Π°ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ·Π²Π°ΡΡ ΠΈΠ· ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ:
send_email_task.delay(user.email)
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΎΡΠΏΡΠ°Π²ΠΊΠ° email Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΠΎ, Π½Π΅ Π²Π»ΠΈΡΡ Π½Π° Π²ΡΠ΅ΠΌΡ ΠΎΡΠ²Π΅ΡΠ° ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ Π·Π°ΠΏΡΠΎΡΠ°.
Π§Π°ΡΡΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ
- ΠΡΡΡΡΡΡΠ²ΠΈΠ΅ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ. ΠΡΠ»ΠΈ Π·Π°Π΄Π°ΡΠΈ Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°ΡΡΡΡ, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡΡ Π²ΠΎΡΠΊΠ΅ΡΠΎΠ².
- ΠΠ΅ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½Π½ΡΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π²Π½ΡΡΡΠΈ Π·Π°Π΄Π°Ρ. ΠΡΠΈΠ±ΠΊΠΈ ΠΌΠΎΠ³ΡΡ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡ ΠΊ ΠΏΠΎΠ²ΡΠΎΡΠ½ΡΠΌ ΠΏΠΎΠΏΡΡΠΊΠ°ΠΌ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π·Π°Π΄Π°ΡΠΈ, ΡΡΠΎ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅Ρ Π½Π°Π³ΡΡΠ·ΠΊΡ Π½Π° ΡΠΈΡΡΠ΅ΠΌΡ.
- ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ Π΄Π»Ρ Π·Π°Π΄Π°Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠ΅Π±ΡΡΡ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π°Π΄Π°ΡΠΈ, ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠΌ, ΠΌΠΎΠ³ΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΏΠ»ΠΎΡ
ΠΎΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΎΠΏΡΡ, Π΅ΡΠ»ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΠΎ.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π‘Π½ΠΈΠΆΠ΅Π½ΠΈΠ΅ p95 latency β ΡΡΠΎ ΡΠ»ΠΎΠΆΠ½ΡΠΉ, Π½ΠΎ Π²Π°ΠΆΠ½ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΠ΅Π±ΡΠ΅Ρ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄Π°. ΠΡΠ»ΠΈ Π²Ρ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΠΈΡΡ Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ Π²ΡΡΠΎΠΊΠΎΠΉ latency Π² Π²Π°ΡΠ΅ΠΌ Django-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, Ρ Π³ΠΎΡΠΎΠ² ΠΏΠΎΠΌΠΎΡΡ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ ΠΈ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΡ. ΠΠ°ΠΏΠΈΡΠ°ΡΡΡΡ Π½Π° ΠΊΠΎΠ½ΡΡΠ»ΡΡΠ°ΡΠΈΡ.