Redis nípasẹ̀ VPN máa ń dà bí ẹni tí ó lọ́ra: dín iye ìpadé fún ìbéèrè kọ̀ọ̀kan kù
VPN kò sọ ìpè Redis tí ó jìnnà di ti agbègbè. Ṣètò iye ìpadé fún ìbéèrè kọ̀ọ̀kan, tún àwọn ìsopọ̀ lò, kí o sì pa pipeline kúrò lọ́dọ̀ àwọn transaction.
Ojú-ìwé tí ó ń dáhùn ní 200 ms sí Redis agbègbè máa ń gba ìṣẹ́jú-ìṣẹ́ mẹ́rin ní kété tí olùpín náà bá wà lẹ́yìn VPN, nígbà tí àwọn olùka server dúró lásán. Slow Log kò fi ohunkóhun tí ó ju millisecond kan hàn, àwòrán CPU jẹ́ pẹlẹbẹ, instance sì ń sin àwọn olùpín mìíràn láìsí ẹ̀sùn. Ohun tí ó yí padà ni ìjìnnà, ohun tí ó sì ń pọ̀ ìjìnnà sí ni iye ìgbà tí kóòdù rẹ dúró tí ó ń retí. Ẹ tẹ̀lé ọ̀nà ìbéèrè náà láti olùpín jáde, ìtúnṣe sì fẹ́rẹ̀ẹ́ máa ń jẹ́ kí àwọn ìdúróde tẹ̀leelé kéré sí i, kì í ṣe server tí ó yára.
Bẹ̀rẹ̀ láti olùpín, kì í ṣe láti àwọn metric server
Ẹ wo ìlànà olùpín láàárín àkọ́kọ́ àṣẹ àti ìkẹyìn. Bí ìtọ́pin bá fi ìdáhùn, ìdánudúró, àti lẹ́yìn náà àṣẹ tí ó kàn hàn, ìwọ ń san ìpadé kíkún fún àṣẹ kọ̀ọ̀kan, kò sì ìtúnṣe server kankan tí yóò yí i padà. Slow Log jẹ́ irinṣẹ́ tí kò tọ́ níbí, nítorí pé ó ń gbasilẹ̀ àkókò ìṣe, ó sì mọ̀ọ́mọ̀ yọ I/O ìbáraẹnisọ̀rọ̀ kúrò. Slow Log mímọ́ lẹ́gbẹ̀ẹ́ endpoint tí ó lọ́ra ni àmì ìṣòro ìpadé.
Wọ̀n ọ̀nà náà fúnra rẹ̀ kí o tó fọwọ́ kan kóòdù. redis-cli -h redis.example.internal --latency ń fi PING tún-tẹ̀lẹ́ ránṣẹ́, ó sì ń tẹ̀ àpapọ̀ àkókò ìbéèrè àti ìdáhùn jáde, ìyẹn ni owó rẹ fún ìpàṣípàrọ̀ kọ̀ọ̀kan. Ṣe é ní ìlọ́po pẹ̀lú iye àwọn àṣẹ tẹ̀leelé nínú ìgbésẹ̀ olùlò kan, ìwọ yóò sì ní ìpìlẹ̀ fún endpoint.
Ka iye ìpadé tí ìgbésẹ̀ olùlò kan gbà gan-an
Mú endpoint kan, kí o sì kọ gbogbo ìpè Redis ní tẹ̀leelé, pẹ̀lú àwọn tí ó pamọ́ sínú ORM, session middleware tàbí wíwá feature flag. Ọ̀pọ̀ endpoint tí ó lọ́ra ń ṣe ìpè ogún tàbí ọgbọ̀n níbi tí mẹ́ta yóò tó, àwọn tí ó pamọ́ sì máa ń jẹ́ apọ̀mọ́.
Ìdè ìgbẹ́kẹ̀lé kò lè kó pa pọ̀: bí àṣẹ kejì bá nílò kọ́kọ́rọ́ tí àkọ́kọ́ dá padà, ìdúróde náà jẹ́ gidi, àwọn àyànfẹ́ kan ṣoṣo ni ìlànà data mìíràn tàbí ìṣe ẹ̀gbẹ́ server tí ó ń sọ gbogbo ìgbésẹ̀ ní ẹ̀ẹ̀kan. Àwọn kíkà tí ó yàtọ̀ síra jẹ́ ọ̀ràn mìíràn, nítorí kò sí ohun tí ó fipá mú ọ láti dúró de ìdáhùn àkọ́kọ́ kí o tó rán èkejì. Sàmì sí ìpè kọ̀ọ̀kan gẹ́gẹ́ bí ìgbẹ́kẹ̀lé tàbí òmìnira kí o tó ṣàtúnṣe ohunkóhun, ìrísí ìtúnṣe yóò sì hàn kedere.
Nọ́mbà tí ó ṣe pàtàkì ni àwọn ìdúróde tẹ̀leelé, kì í ṣe àpapọ̀ àwọn àṣẹ. Ọgbọ̀n àṣẹ nínú batch kan ṣì ń ná ìdúróde kan ṣoṣo.
Ṣe batch kìkì àwọn àṣẹ tí kò gbẹ́kẹ̀lé ara wọn
Pipeline ń to àwọn àṣẹ òmìnira sínú ìlà, ó sì ń kó àwọn ìdáhùn lẹ́sẹẹsẹ, ó ń yí N ìdúróde padà sí ọ̀kan. Ọ̀pọ̀ olùpín ń fi í hàn gẹ́gẹ́ bí block, callback tàbí context manager, kì í ṣe ipò ìsopọ̀ ọ̀tọ̀, nítorí náà ṣàyẹ̀wò API tí ẹ̀dà tí o fi sórí ẹ̀rọ ń pèsè. Èrè náà ń pọ̀ sí i pẹ̀lú àkókò ìpadé, ìdí náà sì ni pé ó ṣe pàtàkì lórí VPN, kò sì fẹ́rẹ̀ẹ́ hàn lórí localhost.
import redis
r = redis.Redis(host="redis.example.internal", port=6379, socket_timeout=2)
pipe = r.pipeline(transaction=False)
for key in ("user:1001", "user:1002", "user:1003"):
pipe.get(key)
print(pipe.execute())
Fi transaction=False ránṣẹ́ nígbà tí o bá kàn fẹ́ batching. Pẹ̀lú àìlẹ́tọ̀ọ́, olùpín ń fi batch wé MULTI àti EXEC, èyí tí ó jẹ́ kí ó ní atomiki, ó sì ń yí ohun tí àwọn olùpín mìíràn lè rí káàkiri padà. Atomiki jẹ́ ìpinnu ìtọ́ sí i, kì í ṣe bọ́tìnì ìṣe, pipeline kò sì jẹ́ transaction kìkì nítorí pé àwọn méjèèjì dín ìpadé kù.
Ka gbogbo ìdáhùn, kì í ṣe ìfilélẹ̀ batch nìkan. Àṣẹ tí ó wà nínú ìlà lè dá àṣìṣe padà nígbà tí gbogbo batch ń parí, olùpín tí ó sì sọn àkójọ ìdáhùn nù yóò yí ìkọ̀wé tí ó kùnà padà sí ìkọ̀wé ìdákẹ́jẹ́. Fi gígùn àkójọ ìdáhùn wé iye àwọn àṣẹ tí o tò sínú ìlà.
Jẹ́ kí ìsopọ̀ wà ní ìyè láàárín àwọn ìgbésẹ̀
Gbogbo ìsopọ̀ tuntun ń san owó yíyọjú orúkọ, TCP handshake, TLS handshake àti AUTH, lórí VPN sì ni ọ̀kọ̀ọ̀kan nínú wọn jẹ́ ìpadé tí o kò lè batch rẹ̀. Ṣẹ̀dá olùpín lẹ́ẹ̀kan fún ìlànà kọ̀ọ̀kan kí o sì tún un lò, tàbí lo pool tí ilé-ìwé rẹ pèsè pẹ̀lú ìwọ̀n tí ó ní ààlà. Títún sopọ̀ fún ìbéèrè kọ̀ọ̀kan ni ìdí kejì tí ó wọ́pọ̀ jù fún àmì yìí lẹ́yìn ìdúróde fún àṣẹ kọ̀ọ̀kan.
Pa hostname àdáni mọ́ nínú ètò, kì í ṣe gẹ́gẹ́ bí àdírẹ́sì gidi. Ìjẹ́rìí fọ́nrán àti ìdánimọ̀ iṣẹ́ ṣì wulo lórí nẹ́tíwọ́kì àdáni, píní IP yóò sì já ní ìṣẹ́jú tí olùpèsè bá tún subnet kọ̀wé. Bí yíyọjú orúkọ bá ni apá tí ó lọ́ra, tún ọ̀nà resolver ṣe, kì í ṣe okùn ìsopọ̀.
Fi socket timeout kedere sílẹ̀ kí tunnel tí ó há mọ́ lè kùnà ní kíákíá dípò kí ó gbé worker ró. Lẹ́yìn náà ṣe ìjẹ́rìí pé pool ń tún lò gan-an nípasẹ̀ gbígbasilẹ̀ ìdá ìsopọ̀ nínú olùpín.
Wọ̀n ìwọ̀n batch kí ó tó di ìṣòro ìrántí
Redis ń di àwọn ìdáhùn tí ó wà nínú ìlà mú fún gbogbo àkókò batch, olùpín sì ń di àbájáde tí a ti yẹ̀wò mú lẹ́yìn náà. Pipeline ẹgbẹ̀rún mẹ́wàá ti àwọn iye ńlá ń pààrọ̀ ìdúróde nẹ́tíwọ́kì fún àwọn ìfo ìrántí àti àwọn ìdánudúró gígùn ní ẹ̀gbẹ́ méjèèjì.
Yan ìwọ̀n batch ní ìbámu pẹ̀lú ìwọ̀n àwọn ìdáhùn, kì í ṣe iye àwọn àṣẹ. Ọgọ́rùn-ún mélòó kan àṣẹ kékeré nínú batch kan máa ń rọrùn, ṣùgbọ́n ọgọ́rùn-ún payload tí ó jẹ́ kílóbáìtì púpọ̀ kò rọrùn. Pín nípa byte àti nípa iye, kí o sì pa batch kọ̀ọ̀kan mọ́ nínú ìwọ̀n latency tí endpoint ní gan-an.
Wọ̀n láti ìbẹ̀rẹ̀ dé ìparí lẹ́yìn ìyípadà: redis-cli -h redis.example.internal --latency-history yóò fi hàn bí ọ̀nà náà fúnra rẹ̀ ṣe dúró ṣinṣin, olùwọ̀n àkókò ìbéèrè rẹ yóò sì fi hàn bí endpoint ti sunwọ̀n sí i. Bí endpoint bá ṣì lọ́ra nígbà tí ìtàn latency jẹ́ pẹlẹbẹ, owó tí ó kù ni iṣẹ́ ẹ̀gbẹ́ server tàbí serialization rẹ fúnra rẹ̀, ìgbésẹ̀ tí ó tẹ̀le ni profile handler, kì í ṣe ìyípadà batch mìíràn.