{"id":53530,"date":"2019-12-04T00:00:00","date_gmt":"2019-12-03T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel"},"modified":"2020-02-18T14:01:26","modified_gmt":"2020-02-18T11:01:26","slug":"uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel","title":{"rendered":"Kiirendame PHP-konnektoreid Tarantooliga Async, Swoole ja Parallel abil.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Kiirendame PHP-konnektoreid Tarantooliga Async, Swoole ja Parallel abil.\" src=\"\/wp-content\/uploads\/2019\/12\/a4bfc8a3f7f7de0298623b1bf9dcfc54.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPHP \u00f6kos\u00fcsteemis on praegu kaks konnektorit, mis t\u00f6\u00f6tavad Tarantool serveriga - see on ametlik PECL laiendus <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\">tarantool\/tarantool-php<\/a><\/noindex>, mis on kirjutatud C-s, ja <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/client\">tarantool-php\/client<\/a><\/noindex>, mis on kirjutatud PHP-s. Mina olen viimase autor.<\/p>\n<p>Selles artiklis jagan tulemusi nende kahe teegi j\u00f5udluse testimisest ja n\u00e4itan, kuidas minimalseid muudatusi koodis tehes saavutada 3-5% j\u00f5udluse kasvu (<i>s\u00fcntetilistel testidel!<\/i>).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Mida me testime?<\/h2>\n<p>\nTestime \u00fclalmainitud <i>s\u00fcnkroonseid<\/i> konnektoreid, k\u00e4ivitatuna as\u00fcnkroonselt, paralleelselt ja as\u00fcnkroonselt-paralleelselt. \ud83d\ude42 Samuti ei soovi me konnektorite koodi muuta. Praegu on saadaval mitmeid laiendusi, mis v\u00f5imaldavad soovitud tulemust:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/swoole\/swoole-src\">Swoole<\/a><\/noindex> \u2015 k\u00f5rge j\u00f5udlusega as\u00fcnkroonne raamistik PHP-le. Seda kasutavad sellised interneti hiiglased nagu Alibaba ja Baidu. Alates versioonist 4.1.0 ilmus maagiline meetod <i>SwooleRuntime::enableCoroutine()<\/i>, mis v\u00f5imaldab \"\u00fche koodireaga muuta PHP s\u00fcnkroonset v\u00f5rgu teeki as\u00fcnkroonseks\".\n<\/li>\n<li>Async \u2015 kuni hiljuti peeti seda \u00fcsna paljulubavaks laienduseks PHP as\u00fcnkroonseks t\u00f6\u00f6ks. Miks kuni hiljuti? Kahjuks on p\u00f5hjus mulle teadmata, autor kustutas hoidla ja projekti edasine saatus on ebaselge. Peame kasutama <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dreamsxin\/ext-async\">\u00fchte<\/a><\/noindex> \u0438\u0437 \u0444\u043e\u0440\u043a\u043e\u0432. \u041a\u0430\u043a \u0438 Swoole, \u044d\u0442\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043b\u0435\u0433\u043a\u0438\u043c \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435\u043c \u0440\u0443\u043a\u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0431\u0440\u044e\u043a\u0438 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043c\u0435\u043d\u043e\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 TCP \u0438 TLS \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0438\u0445 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438. \u0414\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u0447\u0435\u0440\u0435\u0437 \u043e\u043f\u0446\u0438\u044e &#171;<i>async.tcp = 1<\/i>&#171;.\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krakjoe\/parallel\">Parallel<\/a><\/noindex> \u2015 \u00fcsna uus laiendus tuntud Joe Watkinselt, kes on selliste teekide nagu phpdbg, apcu, pthreads, pcov ja uopz autor. See laiendus pakub API-d mitme l\u00f5imega t\u00f6\u00f6ks PHP-s ja positsioneeritakse kui pthreadsi asendaja. Oluline piirang on see, et teek t\u00f6\u00f6tab ainult ZTS (Zend Thread Safe) versiooniga PHP.\n<\/li>\n<\/ul>\n<p><\/p>\n<h2>Kuidas me testime?<\/h2>\n<p>\n\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Tarantool&#8217;\u0430 \u0441 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c \u0436\u0443\u0440\u043d\u0430\u043b\u043e\u043c \u0443\u043f\u0440\u0435\u0436\u0434\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 (<i>wal_mode = none<\/i>) ja suurendatud v\u00f5rgupuhvri (<i>readahead = 1 * 1024 * 1024<\/i>). Esimene valik v\u00e4listab t\u00f6\u00f6tegemise kettaga, teine \u2013 v\u00f5imaldab lugeda rohkem p\u00e4ringuid operatsioonis\u00fcsteemi puhvrisse ja seel\u00e4bi minimeerida s\u00fcsteemik\u00f5nnete arvu.<\/p>\n<p>Andmetega t\u00f6\u00f6tavate benchmarkide (lisamine, kustutamine, lugemine jne) jaoks luuakse benchmarki alustamisel (taas)memtx-ruum, milles esmase indeksi v\u00e4\u00e4rtused genereeritakse j\u00e4rjestatud t\u00e4isarvude generaatoriga (j\u00e4rjekord).<br \/>\nDDL ruum n\u00e4eb v\u00e4lja j\u00e4rgmine:<\/p>\n<pre><code class=\"lua\">space = box.schema.space.create(config.space_name, {id = config.space_id, temporary = true})\nspace:create_index('primary', {type = 'tree', parts = {1, 'unsigned'}, sequence = true})\nspace:format({{name = 'id', type = 'unsigned'}, {name = 'name', type = 'string', is_nullable = false}})<\/code><\/pre>\n<p>\nVajadusel t\u00e4idetakse ruum t\u00e4histatud 10,000 k\u00e4tet\u00fcki n\u00e4idisega enne benchmarki k\u00e4ivitamist.<\/p>\n<pre><code class=\"lua\">{id, \"tupl\u0435_&lt;id&gt;\"}<\/code><\/pre>\n<p>\nK\u00e4tet\u00fckkidele p\u00e4\u00e4seb juurde juhuslike v\u00f5tmev\u00e4\u00e4rtuste kaudu.<\/p>\n<p>Benchmark ise serverile bir kez yap\u0131lan bir iste\u011fi 10,000 kez (devrim) ger\u00e7ekle\u015ftirir, bu da yine yinelemelerde ger\u00e7ekle\u015ftirilir. \u0130terasyonlar, 5 yineleme aras\u0131ndaki zaman sapmalar\u0131n\u0131n %3'l\u00fck bir hata pay\u0131 i\u00e7inde kalana kadar tekrar edilir. Daha sonra ortalama sonu\u00e7 al\u0131n\u0131r. \u0130terasyonlar aras\u0131nda i\u015flemcinin throttling'e gitmemesi i\u00e7in 1 saniyelik bir bekleme s\u00fcresi bulunmaktad\u0131r. Her yinelemeden \u00f6nce Lua'n\u0131n \u00e7\u00f6p toplay\u0131c\u0131s\u0131 devre d\u0131\u015f\u0131 b\u0131rak\u0131l\u0131r ve tamamland\u0131ktan sonra zorla \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r. PHP s\u00fcreci yaln\u0131zca benchmark i\u00e7in gerekli eklentilerle, \u00e7\u0131kt\u0131 tamponlamas\u0131 etkin ve \u00e7\u00f6p toplay\u0131c\u0131s\u0131 devre d\u0131\u015f\u0131 b\u0131rak\u0131larak ba\u015flat\u0131l\u0131r.<\/p>\n<p><i>* Devrim, yineleme say\u0131s\u0131 ve hata e\u015fi\u011fi benchmark ayarlar\u0131nda de\u011fi\u015ftirilebilir.<\/i><\/p>\n<h2>Test ortam\u0131<\/h2>\n<p>\n\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043d\u0438\u0436\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0431\u044b\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u043d\u044b \u043d\u0430 MacBookPro (2015), \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u2014 Fedora 30 (\u0432\u0435\u0440\u0441\u0438\u044f \u044f\u0434\u0440\u0430 5.3.8-200.fc30.x86_64). Tarantool \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0441\u044f \u0432 \u0434\u043e\u043a\u0435\u0440\u0435 \u0432 \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c &#171;<code>--network host\"<\/code>.<\/p>\n<p>Paket versiyonlar\u0131:<\/p>\n<p>Tarantool: 2.3.0-115-g5ba5ed37e<br \/>\nDocker: 19.03.3, build a872fc2f86<br \/>\nPHP: 7.3.11 (cli) (olu\u015fturma: 22 Ekim 2019 08:11:04)<br \/>\ntarantool\/client: 0.6.0<br \/>\nrybakit\/msgpack: 0.6.1<br \/>\next-tarantool: 0.3.2 (+ 7.3 i\u00e7in yamanm\u0131\u015f)*<br \/>\next-msgpack: 2.0.3<br \/>\next-async: 0.3.0-8c1da46<br \/>\next-swoole: 4.4.12<br \/>\next-parallel: 1.1.3<\/p>\n<p>* <i>Kahjuks ametlik \u00fchendus ei toimi PHP versiooniga &gt; 7.2. Et koondada ja k\u00e4ivitada laiend PHP 7.3, tuli kasutada <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\/pull\/148\/files\">patch<\/a><\/noindex>.<\/i><\/p>\n<h2>Tulemused<\/h2>\n<p><\/p>\n<h4>S\u00fcnkroonne re\u017eiim<\/h4>\n<p>\nTarantooli protokoll kasutab binaarformaat <noindex><a rel=\"nofollow\" href=\"https:\/\/msgpack.org\/\">MessagePack<\/a><\/noindex> s\u00f5numite serialiseerimiseks. PECL \u00fchenduses on serialiseerimine peidetud s\u00fcgavale teeki ja selle kodeerimisprotsessi m\u00f5jutamine userland-koodist <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\/issues\/89\">ei ole v\u00f5imalik<\/a><\/noindex>. Puhta PHP \u00fchendus, vastupidi, v\u00f5imaldab kodeerimisprotsessi kohandamist standardse kodeerija laiendamise v\u00f5i oma rakendamise abil. Vaikimisi on saadaval kaks kodeerijat, millest \u00fcks p\u00f5hineb <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/msgpack\/msgpack-php\/\">msgpack\/msgpack-php<\/a><\/noindex> (ametlik MessagePack PECL laiend), teine \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rybakit\/msgpack.php\">rybakit\/msgpack<\/a><\/noindex> (puhta PHP peal).<\/p>\n<p>Enne \u00fchenduste v\u00f5rdlemist m\u00f5\u00f5dame MessagePack kodeerijate j\u00f5udlust PHP \u00fchenduse jaoks ning edasistes testides kasutame seda, mis n\u00e4itab parimat tulemust:<\/p>\n<p><img decoding=\"async\" alt=\"Kiirendame PHP-konnektoreid Tarantooliga Async, Swoole ja Parallel abil.\" src=\"\/wp-content\/uploads\/2019\/12\/a293ec51cb8bf18cb88df2dc276142c4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKuigi PHP versioon (Pure) j\u00e4\u00e4b PECL laiendile kiiruselt alla, soovitaksin siiski reaalsetes projektides kasutada just <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rybakit\/msgpack.php\">rybakit\/msgpack<\/a><\/noindex>, kuna ametlikus laienduses MessagePack formaadi spetsifikatsioon on rakendatud ainult osaliselt (n\u00e4iteks ei ole kasutaja andmet\u00fc\u00fcpide toetust, ilma milleta ei saa kasutada Decimalit \u2014 uut andmet\u00fc\u00fcpi, mis on esitatud Tarantoolis 2.3) ning tal on mitmeid muid <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/msgpack\/msgpack-php\/issues\">probleemide<\/a><\/noindex> (sealhulgas \u00fchilduvusprobleeme PHP 7.4-ga). Ja \u00fcldiselt tundub projekt mahaj\u00e4etuna.<\/p>\n<p>Seega m\u00f5\u00f5dame \u00fchenduste j\u00f5udlust s\u00fcnkroonses re\u017eiimis:<\/p>\n<p><img decoding=\"async\" alt=\"Kiirendame PHP-konnektoreid Tarantooliga Async, Swoole ja Parallel abil.\" src=\"\/wp-content\/uploads\/2019\/12\/d8c5765956c62b927014ec4f26547820.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNagu graafikust n\u00e4ha, n\u00e4itab PECL (Tarantool) \u00fchendus paremat j\u00f5udlust v\u00f5rreldes PHP (Client) \u00fchendusega. See ei ole \u00fcllatav, arvestades, et viimane, pealegi, et see on kirjutatud aeglasemas keeles, teeb p\u00f5him\u00f5tteliselt rohkem t\u00f6\u00f6d: iga kutsumisega luuakse uus objekt <i>Request<\/i> ja <i>Vastus<\/i> (Selecti puhul \u2014 veel ka <i>Criteria<\/i>, ja Update\/Upsert puhul \u2014 <i>Operations<\/i>), eraldi \u00fcksused <i>\u00dchendus<\/i>, <i>Packer <\/i>ja <i>Handler<\/i> toovad samuti lisakulusid. On ilmne, et paindlikkuse eest tuleb maksta. Kuid \u00fcldiselt n\u00e4itab PHP t\u00f5lgendi head j\u00f5udlust, kuigi erinevus on olemas, on see ebaoluline ja v\u00f5ib olla isegi v\u00e4iksem, kui kasutada Preloadingut PHP 7.4-s, r\u00e4\u00e4kimata JIT-ist PHP 8-s.<\/p>\n<p>Liigume edasi. Tarantool 2.0 toob kaasa SQL toe. Proovime teha Select, Insert, Update ja Delete tehinguid SQL-protokolli abil ning v\u00f5rreldes tulemusi noSQL (binaarsete) vastetega:<\/p>\n<p><img decoding=\"async\" alt=\"Kiirendame PHP-konnektoreid Tarantooliga Async, Swoole ja Parallel abil.\" src=\"\/wp-content\/uploads\/2019\/12\/cbc61697d9670dc7384c25de3c63c8d5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSQL tulemused ei ole eriti muljetavaldavad (kordan, et me testime endiselt s\u00fcnkroonre\u017eiimi). Siiski ei tasu mul pahandada, kuna SQL tugi on endiselt aktiivses arenduses (kohtuv\u00e4liselt on n\u00e4iteks lisatud tugi <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool\/commit\/ff2091e09b5a7e9b7aa3f3e996dc7a06189889f3\">prepared statements<\/a><\/noindex>). Ja, nagu loetelu n\u00e4itab, ootab SQL mootor veel mitmeid optimeerimisi. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool\/issues?q=is%3Aissue+is%3Aopen+sql+label%3Aperformance\">issues<\/a><\/noindex>As\u00fcnkroonne<\/p>\n<h4>Noh, vaatame n\u00fc\u00fcd, kuidas as\u00fcnkroonne laiendus suudab meie eeltoodud tulemusi parandada. As\u00fcnkroonsete programmide kirjutamiseks pakub laiendus API-d korutine (coroutine) p\u00f5hjal, mida me kasutame. Katse tegemise k\u00e4igus selgub, et meie keskkonna optimaalne korutinide arv on 25:<\/h4>\n<p>\n\u201eJaotame\u201c 10,000 tehingut 25 korutini vahel ja vaatame, mis v\u00e4lja tuli:<\/p>\n<p><img decoding=\"async\" alt=\"Kiirendame PHP-konnektoreid Tarantooliga Async, Swoole ja Parallel abil.\" src=\"\/wp-content\/uploads\/2019\/12\/4ceefef522b3bd91db7327c609ddda09.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nTehingute arv sekundis kasvas rohkem kui kolm korda<\/p>\n<p><img decoding=\"async\" alt=\"Kiirendame PHP-konnektoreid Tarantooliga Async, Swoole ja Parallel abil.\" src=\"\/wp-content\/uploads\/2019\/12\/916e461dfa5d1be08317e3703c267afe.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKahjuks ei k\u00e4ivitu PECL konnektor ext-async'iga. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/client\">tarantool-php\/client<\/a><\/noindex>!<\/p>\n<p>Aga mis SQL-iga?<\/p>\n<p>Aga mis SQLiga?<\/p>\n<p><img decoding=\"async\" alt=\"Kiirendame PHP-konnektoreid Tarantooliga Async, Swoole ja Parallel abil.\" src=\"\/wp-content\/uploads\/2019\/12\/39a0da214b893a217d9ae4eae23c4168.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNagu n\u00e4ete, on as\u00fcnkroonses re\u017eiimis binaarse protokolli ja SQL vaheline erinevus j\u00e4\u00e4nud veamarginaali piiresse.<\/p>\n<h4>Swoole<\/h4>\n<p>\nUurime j\u00e4lle optimaalset korutinate arvu, seekord juba Swoole jaoks:<br \/>\n<img decoding=\"async\" alt=\"Kiirendame PHP-konnektoreid Tarantooliga Async, Swoole ja Parallel abil.\" src=\"\/wp-content\/uploads\/2019\/12\/70d5bb26b91b7459e2f0b80a3fab7e06.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPeame kinni 25-st. Korrame sama trikki, mis Async laiendusega \u2013 jagame 10,000 toimingut 25 korutina vahel. Lisaks sellele lisame veel \u00fche testi, kus jagame kogu t\u00f6\u00f6 kahe protsessi vahel (st iga protsess t\u00e4idab 5,000 toimingut 25 korutina). Protsessid luuakse kasutades <i>SwooleProcess<\/i>. <\/p>\n<p>Tulemused:<\/p>\n<p><img decoding=\"async\" alt=\"Kiirendame PHP-konnektoreid Tarantooliga Async, Swoole ja Parallel abil.\" src=\"\/wp-content\/uploads\/2019\/12\/55f55d2661aa43ca3b6641abfff078a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSwoole n\u00e4itab \u00fche protsessi k\u00e4ivitamisel veidi madalamat tulemust v\u00f5rreldes Asynciga, kuid kahe protsessi puhul muutub olukord kardinaalselt (number 2 ei ole juhuslik, minu masinal n\u00e4itas just 2 protsessi parimat tulemust).<\/p>\n<p><i>Muide, Async laienduses on samuti API protsesside t\u00f6\u00f6ks, kuid seal ei m\u00e4rganud ma mingit erinevust, kas ben\u0161marke k\u00e4ivitati \u00fches v\u00f5i mitmes protsessis (ei v\u00e4lista, et ma kuskil eksisin).<\/i><\/p>\n<p>SQL vs binaarne protokoll:<\/p>\n<p><img decoding=\"async\" alt=\"Kiirendame PHP-konnektoreid Tarantooliga Async, Swoole ja Parallel abil.\" src=\"\/wp-content\/uploads\/2019\/12\/dfa56be01ebba25edbec492838112778.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNii nagu Asynci puhul, muudab as\u00fcnkroonne re\u017eiim binaarsete ja SQL-toimingute vahekorra olematuks.<\/p>\n<h4>Parallel<\/h4>\n<p>\nKuna Parallel laiendus ei k\u00e4sitle korutiine, vaid vooge, saame m\u00f5\u00f5ta optimaalse paralleelsete voogude arvu:<\/p>\n<p><img decoding=\"async\" alt=\"Kiirendame PHP-konnektoreid Tarantooliga Async, Swoole ja Parallel abil.\" src=\"\/wp-content\/uploads\/2019\/12\/acc6796d5731b0402ad6323e0f5bf38f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSee on mu masinas 16. K\u00e4ivitame \u00fchenduspunktide benchmarkid 16 paralleelse vooga:<\/p>\n<p><img decoding=\"async\" alt=\"Kiirendame PHP-konnektoreid Tarantooliga Async, Swoole ja Parallel abil.\" src=\"\/wp-content\/uploads\/2019\/12\/03210b70f15e445fdd311a17c1034290.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKuidas n\u00e4ete, on tulemus isegi parem kui as\u00fcnkroonsete laienduste puhul (v\u00e4lja arvatud Swoole, mis t\u00f6\u00f6tab 2 protsessis). Pange t\u00e4hele, et PECL \u00fchenduspunkti puhul on Update ja Upsert toimingute kohal t\u00fchjus. See on seotud sellega, et need toimingud kukkusid vigade t\u00f5ttu v\u00e4lja \u2014 ei tea, kas ext-paralleel, ext-tarantool v\u00f5i m\u00f5lemad on s\u00fc\u00fcdi.<\/p>\n<p>N\u00fc\u00fcd v\u00f5rrelge SQL-i j\u00f5udlust:<\/p>\n<p><img decoding=\"async\" alt=\"Kiirendame PHP-konnektoreid Tarantooliga Async, Swoole ja Parallel abil.\" src=\"\/wp-content\/uploads\/2019\/12\/4be3025b424ad6485dc96968ce224bf5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKas m\u00e4rkate sarnasust diagrammiga, mis on genereeritud s\u00fcnkroonselt k\u00e4itatud \u00fchenduspunktide jaoks?<\/p>\n<h4>K\u00f5ik kokku<\/h4>\n<p>\nJa viimaseks, viime k\u00f5ik tulemused \u00fcheks diagrammiks, et n\u00e4ha \u00fcldpilti testitud laienduste jaoks. Lisame diagrammile ainult \u00fche uue testi, mida me pole veel teinud \u2014 k\u00e4ivitame Async korutiinid paralleelselt, kasutades Parallel*. \u00dchendamine eelnevalt mainitud laiendustega on juba <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krakjoe\/parallel\/issues\/25\">arutatud<\/a><\/noindex> autorite poolt, kuid n\u00f5usolek ei olnud saavutatud, peame seda ise tegema. <\/p>\n<p><i>* Swoole korutiinide k\u00e4ivitamine Paralleliga ei \u00f5nnestunud, tundub, et need laiendused ei \u00fchildu.<\/i><\/p>\n<p>Seega, l\u00f5plikud tulemused:<\/p>\n<p><img decoding=\"async\" alt=\"Kiirendame PHP-konnektoreid Tarantooliga Async, Swoole ja Parallel abil.\" src=\"\/wp-content\/uploads\/2019\/12\/85478d9dd5d8bd166f4aa91963c1af95.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Kokkuv\u00f5tte asemel<\/h2>\n<p>\nMinu arvates on tulemused \u00fcsna head ja mul on kummaline tunne, et see pole veel piir! Kas see on teile reaalses projektis vajalik, otsustate ainult teie, v\u00f5in vaid \u00f6elda, et see oli minu jaoks huvitav katse, mis v\u00f5imaldas hinnata, kui palju saab \u201ev\u00e4lja pigistada\u201c s\u00fcnkroonse TCP-konnektori abil minimaalse vaevaga. Kui teil on ideid, kuidas benchmarke parandada - olen r\u00f5\u00f5mus, et kaaluda teie pulli taotluse. Kogu kood koos k\u00e4ivitamisjuhiste ja tulemustega on avaldatud eraldi <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/benchmarks\">repositoriis<\/a><\/noindex>.<br \/>\n<br \/>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/478336\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0435 PHP \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0432\u0430 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c Tarantool \u2015 \u044d\u0442\u043e \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 PECL tarantool\/tarantool-php, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u043d\u0430 \u0421, \u0438 tarantool-php\/client, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 PHP. \u042f \u044f\u0432\u043b\u044f\u044e\u0441\u044c \u0430\u0432\u0442\u043e\u0440\u043e\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0435\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u043a\u043e\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-53530","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0435 PHP \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0432\u0430 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c Tarantool \u2015 \u044d\u0442\u043e \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 PECL tarantool\/tarantool-php, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u043d\u0430 \u0421, \u0438 tarantool-php\/client, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 PHP. \u042f \u044f\u0432\u043b\u044f\u044e\u0441\u044c \u0430\u0432\u0442\u043e\u0440\u043e\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0435\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u043a\u043e\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0423\u0441\u043a\u043e\u0440\u044f\u0435\u043c PHP-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u044b \u0434\u043b\u044f Tarantool \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Async, Swoole \u0438 Parallel | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0435 PHP \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0432\u0430 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c Tarantool \u2015 \u044d\u0442\u043e \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 PECL tarantool\/tarantool-php, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u043d\u0430 \u0421, \u0438 tarantool-php\/client, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 PHP. \u042f \u044f\u0432\u043b\u044f\u044e\u0441\u044c \u0430\u0432\u0442\u043e\u0440\u043e\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0435\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u043a\u043e\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-12-03T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:01:26+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Kiirendame PHP-konnektoreid Tarantoolile Async, Swoole ja Parallel abil | ProHoster","description":"Praegu on PHP \u00f6kos\u00fcsteemis kaks konnektorit Tarantooli serveriga t\u00f6\u00f6tamiseks - ametlik PECL tarantool\/tarantool-php laiendus, mis on kirjutatud C-s, ja tarantool-php\/client, mis on kirjutatud PHP-s. Olen viimane autor. Selles artiklis soovin jagada m\u00f5lema teegi j\u00f5udluse testimise tulemusi ja n\u00e4idata, kuidas minimaalsete koodimuudatustega saab saavutada","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0423\u0441\u043a\u043e\u0440\u044f\u0435\u043c PHP-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u044b \u0434\u043b\u044f Tarantool \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Async, Swoole \u0438 Parallel | ProHoster","og:description":"\u0412 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0435 PHP \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0432\u0430 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c Tarantool \u2015 \u044d\u0442\u043e \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 PECL tarantool\/tarantool-php, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u043d\u0430 \u0421, \u0438 tarantool-php\/client, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 PHP. \u042f \u044f\u0432\u043b\u044f\u044e\u0441\u044c \u0430\u0432\u0442\u043e\u0440\u043e\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0435\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u043a\u043e\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-12-03T21:00:00+00:00","article:modified_time":"2020-02-18T11:01:26+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"53530","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 07:46:24","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:23:55","updated":"2026-01-24 07:46:24"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/53530","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=53530"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/53530\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=53530"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=53530"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=53530"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}