Haɓaka masu haɗin PHP don Tarantool ta amfani da Async, Swoole da Parallel

Haɓaka masu haɗin PHP don Tarantool ta amfani da Async, Swoole da Parallel

A cikin yanayin yanayin PHP a halin yanzu akwai masu haɗin kai guda biyu don aiki tare da uwar garken Tarantool - wannan shine haɓakar PECL na hukuma. tarantool/tarantool-php, an rubuta cikin C, da tarantool-php/client, an rubuta da PHP. Ni ne marubucin karshen.

A cikin wannan labarin, Ina so in raba sakamakon gwajin aiki na ɗakunan karatu biyu kuma in nuna yadda, tare da ƙananan canje-canje ga lambar, za ku iya samun haɓaka aikin 3-5 (akan gwaje-gwajen roba!).

Me za mu gwada?

Za mu gwada waɗanda aka ambata a sama aiki tare masu haɗin haɗin da ke gudana ba tare da an daidaita su ba, a layi daya, da asynchronously-parallel. 🙂 Har ila yau, ba ma so mu taɓa lambar masu haɗin kansu. A halin yanzu akwai kari da yawa don cimma abin da kuke so:

  • Swoole - babban tsarin aiki asynchronous don PHP. Ana amfani da irin waɗannan kattai na Intanet kamar Alibaba da Baidu. Tun daga sigar 4.1.0 wata hanyar sihiri ta bayyana SwooleRuntime :: kunnaCoroutine(), wanda ke ba ku damar "canza dakunan karatu na cibiyar sadarwa na PHP masu aiki tare zuwa waɗanda ba a daidaita su tare da layin lamba ɗaya."
  • Async ya kasance har zuwa kwanan nan wani haɓaka mai ban sha'awa don aikin asynchronous a cikin PHP. Me yasa har kwanan nan? Abin takaici, saboda wani dalili da ban sani ba, marubucin ya goge ma'ajiyar kuma ba a san makomar aikin ba. Dole ne in yi amfani da shi daya daga cokali mai yatsu. Kamar Swoole, wannan tsawo yana ba ku damar kunna wando cikin sauƙi tare da ƙwanƙwasa wuyan hannu don kunna asynchrony ta maye gurbin daidaitaccen aiwatar da rafukan TCP da TLS tare da nau'ikan asynchronous. Ana yin wannan ta hanyar zaɓi "async.tcp = 1".
  • Daidai - sabon haɓakawa daga sanannen Joe Watkins, marubucin irin waɗannan ɗakunan karatu kamar phpdbg, apcu, pthreads, pcov, uopz. Tsawaita yana ba da API don multithreading a cikin PHP kuma an sanya shi azaman maye gurbin pthreads. Babban iyakancewar ɗakin karatu shine kawai yana aiki tare da sigar ZTS (Zend Thread Safe) na PHP.

Ta yaya za mu gwada?

Bari mu ƙaddamar da misalin Tarantool tare da naƙasasshen shiga-gaba (wal_mode = babu) da kuma ƙara yawan buffer na cibiyar sadarwa (karantawa = 1 * 1024 * 1024). Zaɓin farko zai kawar da aiki tare da faifai, na biyu zai ba da damar karanta ƙarin buƙatun daga buffer tsarin aiki kuma ta haka ne rage yawan kiran tsarin.

Don alamomin da ke aiki tare da bayanai (shigarwa, gogewa, karantawa, da sauransu), kafin fara ma'auni, za a ƙirƙiri sarari memtx (sake) wanda a cikinsa aka ƙirƙiri ƙimar ƙimar farko ta janareta na ƙimar ƙima. (jeri).
sarari DDL yayi kama da haka:

space = box.schema.space.create(config.space_name, {id = config.space_id, temporary = true})
space:create_index('primary', {type = 'tree', parts = {1, 'unsigned'}, sequence = true})
space:format({{name = 'id', type = 'unsigned'}, {name = 'name', type = 'string', is_nullable = false}})

Idan ya cancanta, kafin gudanar da ma'auni, sararin yana cike da tuples 10,000 na fom.

{id, "tuplе_<id>"}

Ana samun isa ga tuples ta amfani da ƙimar maɓalli bazuwar.

Ma'auni kanta buƙatu ɗaya ce ga uwar garken, wanda ake aiwatar da sau 10,000 (juyin juya hali), wanda, bi da bi, ana aiwatar da shi cikin maimaitawa. Ana maimaita maimaitawa har sai duk sabani tsakanin 5 da ke cikin kuskuren karɓuwa na 3%*. Bayan wannan, ana ɗaukar matsakaicin sakamako. Akwai tsayawar daƙiƙa 1 tsakanin maimaitawa don hana mai sarrafawa daga maƙarƙashiya. Mai tara shara na Lua yana naƙasasshe kafin kowace ƙararrawa kuma ana tilastawa farawa bayan ya gama. Ana ƙaddamar da tsarin PHP tare da ƙarin abubuwan da ake buƙata don maƙasudin, tare da kunna kayan aiki da kuma kashe mai tara shara.

* Ana iya canza adadin juyi, maimaitawa da madaidaicin kuskure a cikin saitunan ma'auni.

Gwajin yanayi

Sakamakon da aka buga a ƙasa an yi su akan MacBookPro (2015), tsarin aiki - Fedora 30 (Sigar kwaya 5.3.8-200.fc30.x86_64). An ƙaddamar da Tarantool a cikin docker tare da siga "--network host".

Sigar fakitin:

Tarantool: 2.3.0-115-g5ba5ed37e
Docker: 19.03.3, gina a872fc2f86
PHP: 7.3.11 (cli) (gina: Oktoba 22, 2019 08:11:04)
tarantool/abokin ciniki: 0.6.0
rybakit/msgpack: 0.6.1
ext-tarantool: 0.3.2 (+ patch for 7.3)*
ext-msgpack: 2.0.3
Ext-async: 0.3.0-8c1da46
Shafin: 4.4.12
daidai-daidai: 1.1.3

* Abin takaici, mai haɗin hukuma ba ya aiki tare da sigar PHP> 7.2. Don haɗawa da gudanar da tsawo akan PHP 7.3, dole ne in yi amfani da su faci.

Результаты

Yanayin aiki tare

Ka'idar Tarantool tana amfani da tsarin binary Kunshin saƙo don daidaita saƙonni. A cikin mai haɗin PECL, serialization yana ɓoye zurfi a cikin zurfin ɗakin karatu kuma yana rinjayar tsarin ɓoyewa daga lambar ƙasa mai amfani. ba ze yiwu ba. Mai haɗin PHP mai tsafta, akasin haka, yana ba da ikon tsara tsarin rufaffiyar ta hanyar tsawaita madaidaicin encoder ko ta amfani da aiwatarwar ku. Akwai encoders guda biyu akwai daga cikin akwatin, ɗayan yana dogara ne akan msgpack/msgpack-php (tsari na MessagePack PECL na hukuma), ɗayan yana kunne rybakit/msgpack (a cikin PHP zalla).

Kafin kwatanta masu haɗin kai, za mu auna aikin maƙallan MessagePack don mahaɗin PHP kuma a cikin ƙarin gwaje-gwaje za mu yi amfani da wanda ke nuna mafi kyawun sakamako:

Haɓaka masu haɗin PHP don Tarantool ta amfani da Async, Swoole da Parallel
Kodayake sigar PHP (Tsaftace) tana ƙasa da haɓakar PECL cikin sauri, a cikin ayyukan gaske har yanzu zan ba da shawarar amfani da shi. rybakit/msgpack, saboda a cikin tsawo na MessagePack na hukuma tsarin ƙayyadaddun tsari yana aiwatar da wani bangare ne kawai (alal misali, babu tallafi ga nau'ikan bayanan al'ada, ba tare da wanda ba za ku iya amfani da Decimal ba - sabon nau'in bayanan da aka gabatar a cikin Tarantool 2.3) kuma yana da adadin wasu matsaloli (ciki har da batutuwan dacewa tare da PHP 7.4). To, a gaba ɗaya, aikin ya dubi watsi.

Don haka, bari mu auna aikin masu haɗawa a cikin yanayin aiki tare:

Haɓaka masu haɗin PHP don Tarantool ta amfani da Async, Swoole da Parallel
Kamar yadda ake iya gani daga jadawali, mai haɗin PECL (Tarantool) yana nuna kyakkyawan aiki idan aka kwatanta da mai haɗin PHP (Client). Amma wannan ba abin mamaki bane, saboda cewa na ƙarshe, ban da aiwatar da shi a cikin harshe mai hankali, a zahiri yana yin ƙarin aiki: an ƙirƙiri sabon abu tare da kowane kira. request и Response (a cikin yanayin Zaɓi - kuma sharudda, kuma a yanayin Sabuntawa / Upsert - Ayyuka), ƙungiyoyi daban-daban Connection, Packer и Handler suna kuma kara sama sama. Babu shakka, sassauci yana zuwa akan farashi. Koyaya, gabaɗaya, mai fassara na PHP yana nuna kyakkyawan aiki, kodayake akwai bambanci, ba shi da mahimmanci kuma, wataƙila, zai zama ma ƙasa da lokacin amfani da preloading a cikin PHP 7.4, ba tare da ambaton JIT a cikin PHP 8 ba.

Mu ci gaba. Tarantool 2.0 ya ƙara tallafi don SQL. Bari mu yi ƙoƙarin yin Zaɓi, Saka, Sabuntawa da Share ayyuka ta amfani da ka'idar SQL kuma kwatanta sakamakon da noSQL (binary) daidai:

Haɓaka masu haɗin PHP don Tarantool ta amfani da Async, Swoole da Parallel
Sakamakon SQL ba su da ban sha'awa sosai (bari in tunatar da ku cewa har yanzu muna gwada yanayin aiki tare). Koyaya, ba zan yi fushi game da wannan ba kafin lokaci; Tallafin SQL har yanzu yana ƙarƙashin ci gaba mai ƙarfi (kwanan nan, alal misali, an ƙara tallafi. maganganun da aka shirya) da kuma, yin hukunci da lissafin al'amurran da suka shafi, Injin SQL zai fuskanci yawancin ingantawa a nan gaba.

async

To, yanzu bari mu ga yadda tsawo na Async zai iya taimaka mana inganta sakamakon da ke sama. Don rubuta shirye-shiryen asynchronous, tsawo yana ba da API dangane da coroutines, waɗanda za mu yi amfani da su. Mun gano a zahiri cewa mafi kyawun adadin coroutines don yanayin mu shine 25:

Haɓaka masu haɗin PHP don Tarantool ta amfani da Async, Swoole da Parallel
"Yaɗa" ayyuka 10,000 a cikin 25 coroutines kuma ga abin da ya faru:

Haɓaka masu haɗin PHP don Tarantool ta amfani da Async, Swoole da Parallel
Yawan ayyukan da aka yi a cikin daƙiƙa ya ƙaru fiye da sau 3 don tarantool-php/client!

Abin baƙin ciki, mai haɗin PECL bai fara da ext-async ba.

Menene SQL?

Haɓaka masu haɗin PHP don Tarantool ta amfani da Async, Swoole da Parallel
Kamar yadda kake gani, a cikin yanayin asynchronous bambanci tsakanin tsarin binary da SQL ya zama cikin gefen kuskure.

Swoole

Mun sake gano mafi kyawun adadin coroutines, wannan lokacin don Swoole:
Haɓaka masu haɗin PHP don Tarantool ta amfani da Async, Swoole da Parallel
Bari mu tsaya a 25. Bari mu sake maimaita wannan dabarar kamar tare da tsawo na Async - rarraba ayyukan 10,000 tsakanin 25 coroutines. Bugu da ƙari, za mu ƙara wani gwajin da za mu raba duk aikin zuwa matakai 2 guda biyu (wato, kowane tsari zai yi ayyuka 5,000 a cikin 25 coroutines). Za a ƙirƙiri matakai ta amfani da su Tsarin Swoole.

Sakamako:

Haɓaka masu haɗin PHP don Tarantool ta amfani da Async, Swoole da Parallel
Swole yana nuna ɗan ƙaramin sakamako idan aka kwatanta da Async lokacin da ake gudanar da shi a cikin tsari ɗaya, amma tare da aiwatar da 2 hoton yana canzawa sosai (lambar 2 ba a zaɓa ta kwatsam ba; akan injina, matakan 2 ne suka nuna mafi kyawun sakamako).

Af, tsawo na Async yana da API don aiki tare da matakai, amma a can ban lura da wani bambanci daga gudanar da ma'auni a cikin ɗaya ko fiye da matakai ba (yana yiwuwa na lalata wani wuri).

SQL vs binary yarjejeniya:

Haɓaka masu haɗin PHP don Tarantool ta amfani da Async, Swoole da Parallel
Kamar yadda yake tare da Async, ana kawar da bambanci tsakanin ayyukan binary da SQL a yanayin asynchronous.

Daidai

Tun da Parallel Extension ba game da coroutines ba ne, amma game da zaren, bari mu auna mafi kyawun adadin zaren layi ɗaya:

Haɓaka masu haɗin PHP don Tarantool ta amfani da Async, Swoole da Parallel
Daidai yake da 16 akan injina. Bari mu gudanar da alamomin haɗin kai akan zaren layi ɗaya guda 16:

Haɓaka masu haɗin PHP don Tarantool ta amfani da Async, Swoole da Parallel
Kamar yadda kake gani, sakamakon ya fi kyau tare da kari na asynchronous (ba ƙidaya Swoole yana gudana akan matakai 2 ba). Lura cewa ga mai haɗin PECL, Sabuntawa da Ayyukan Upsert ba su da komai. Wannan shi ne saboda gaskiyar cewa waɗannan ayyukan sun gaza tare da kuskure - Ban sani ba ko laifin ext-parallel, ext-tarantool, ko duka biyu ne.

Yanzu bari mu kwatanta aikin SQL:

Haɓaka masu haɗin PHP don Tarantool ta amfani da Async, Swoole da Parallel
Lura da kamanceceniya da jadawali don masu haɗin haɗin gwiwa suna aiki tare?

Tare

Kuma a ƙarshe, bari mu taƙaita duk sakamakon a cikin jadawali ɗaya don ganin cikakken hoto don haɓakawa da aka gwada. Bari mu ƙara sabon gwaji guda ɗaya kawai a cikin ginshiƙi, wanda ba mu yi ba tukuna - bari mu gudanar da Async coroutines a layi daya ta amfani da Parallel*. Tunanin haɗa abubuwan haɓakawa na sama ya rigaya tattauna marubuta, amma ba a cimma matsaya ba, za ku yi da kanku.

* Ba zai yiwu a ƙaddamar da Swoole coroutines tare da Parallel ba; da alama waɗannan kari ba su dace ba.

Don haka, sakamakon ƙarshe:

Haɓaka masu haɗin PHP don Tarantool ta amfani da Async, Swoole da Parallel

Maimakon a ƙarshe

A ra'ayi na, sakamakon ya zama abin da ya dace, kuma saboda wasu dalilai na tabbata cewa wannan ba iyaka ba ne! Ko kuna buƙatar yanke shawarar wannan a cikin ainihin aikin don kanku kawai, zan ce kawai a gare ni gwaji ne mai ban sha'awa wanda ke ba ku damar kimanta nawa zaku iya "matsi" daga mai haɗin TCP na aiki tare tare da ƙaramin ƙoƙari. Idan kuna da ra'ayoyi don inganta ma'auni, zan yi farin cikin yin la'akari da buƙatar ku. Ana buga duk lambar tare da umarnin ƙaddamarwa da sakamako a cikin wani dabam wuraren ajiya.

source: www.habr.com

Add a comment