DevDebata

Jak poradzić sobie z wydajnością w Magento? Devdebata

Adobe Systems kupiło Magento za 1,68 miliarda dolarów. Ten news od kilku dni hula po branżowych portalach. My postanowiliśmy wykorzystać tę okazję i zorganizowaliśmy devdebatę na temat Magento. Zapytaliśmy w niej developerów m.in. o to, jaką znają najciekawszą funkcjonalność w Magento, jak radzą sobie ze skalowalnością oraz co w tym otwartym oprogramowaniu sklepowym mogłoby zostać lepiej zrobione.

Odpowiedzi udzielają:

Mateusz Bukowski. PHP Developer w Divante. Programista nie tylko z zawodu, ale także z zamiłowania. Zawodowo zajmuje się tworzeniem i wdrażaniem rozwiązań e-commerce dla międzynarodowych klientów, zwracający bardzo dużą uwagę, na jakość i standardy wytwarzanego oprogramowania. Po godzinach game developer, grafik komputerowy, gitarzysta.

 

 

Tymoteusz Hajder. Magento Developer w Snowdog. Swoją przygodę z programowaniem rozpoczął w szkole podstawowej, a w szkole średniej napisał swój pierwszy startup. Od najmłodszych lat lubił wyzwania i problemy – szczególnie te związane z big data: architekturą, skalowalnością systemów, aplikacji, czy platform. W codziennej pracy ceni dobrze napisany kod, wraz z jego dokumentacją. Podczas swojej kariery zawodowej tworzył również aplikacje na Androida. Uwielbia ludzi z pasją. W wolnych chwilach zajmuje się realizacją i tworzeniem muzyki.

 

Patryk Święczkowski. Lider Techniczny w Sii Polska. Developer z ponad 10 letnim doświadczeniem w zakresie aplikacji wykorzystujących PHP, w tym full-stack development. Pasjonat czystego kodu, S.O.L.I.D. Lubi rozwiązywać trudne problemy techniczne i uczyć się nowych technologii. W ciągu ostatnich 5 lat pracował głównie nad projektami opartymi na Magento i Zend Framework. Specjalista w zakresie Magento Enterprise.


Pytanie #1. Jaką znasz najciekawszą funkcjonalność/mechanizm Magento?

Odpowiada Mateusz Bukowski, Divante:

Magento ma wiele ciekawych rozwiązań. Na pewno warto wyróżnić oparte o wzorzec CQRS Split Databases, dostępne w Magento Enterprise. Dzięki temu, nasza aplikacja może łączyć się z dodatkowymi głównymi, odseparowanymi od siebie bazami danych (master). Każda z baz może obsługiwać zapytania, do wydzielonej funkcjonalności (checkout, zarządzanie zamówieniami, katalog, itp.), a oprócz tego każda z nich może zostać rozbita na podbazy (slave). Na uwagę zasługuje również dostępne out of the box, wsparcie dla FPC, z natywnym wsparciem dla Varnisha.

Moje uznanie jako dewelopera zyskały rozwiązania wykorzystywane podczas codziennej pracy. Wykorzystanie wzorca MVC, zastosowanie modelu EAV, czy też takie smaczki jak m.in. Autowire Dependency Injection znane chociażby przez developerów Symfony, czyli wstrzykiwanie zależności przez konstruktor, bez konieczności konfiguracji serwisów czy też użycie Pluginów (Interceptory), czyli specjalnych klas, dzięki którym możemy modyfikować zachowanie każdej publicznej metody, która już istnieje, poprzez przechwycenie jej wywołania, a następnie wykonania nowej logiki przed/po wywołaniu tej metody bądź całkowicie ją modyfikując. Można by wymienić również Service Contacts, Performance Toolkit, wsparcie dla Elastic Searcha, integrację z B2B, system kolejkowania asynchronicznego RabbitMQ. Do tego taką wisienką na torcie jest fakt, że Magento posiada gotowe testy wydajnościowe Jmeter’a, testy jednostkowe, integracyjne, funkcjonalne, a cały kod jest utrzymywany według standardów PSR.

Odpowiada Tymoteusz Hajder, Snowdog:

Zdecydowanie najciekawszą funkcjonalnością tak dużej i skomplikowanej platformy jaką jest Magento jest Content Staging. Magento daje nam potężne możliwości zarządzania treścią z poziomu panelu administracyjnego; począwszy od produktów, przechodząc przez kategorie, strony CMSowe, ceny, czy też warunki sprzedażowe. Dodatkowo możliwość planowania automatycznego wdrażania modyfikacji treści czyni ją bezkonkurencyjną pod tym względem.

Odpowiada Patryk Święczkowski, Sii Polska:

Ciekawe pytanie, ponieważ Magento jest dużym kombajnem zawierającym w sobie wiele elementów, zarówno trochę CMS, ERP, sklepu, magazynu, czy narzędzi do raportowania. Z punktu widzenia programisty, powiedziałbym, że to co wyróżnia Magento i jest ciekawym to model EAV (Entity Attribute Value). Co w połączeniu z tym, że jest open-source pozwala na niezliczone modyfikacje i rozszerzenia.

Pytanie #2. Jak radzisz sobie z wydajnością i skalowalnością takiej kobyły?

Odpowiada Mateusz Bukowski, Divante:

Względem Magento 1, skalowalność i wydajność została mocno poprawiona. Samo Magento jako aplikacja modularna pozwala w łatwy sposób rozszerzać kod aplikacji przez Composer’a. Magento 2 natywnie wspiera FPC dlatego w łatwy sposób można podpiąć pod usługę reverse proxy cache – Varnish’a. W naszych wdrożeniach standardem również jest wykorzystanie Redis’a do przechowywania sesji oraz backend cache. Oczywiście Magento, a konkretniej Magento Community ma swoje minusy. Sporym problemem jest tutaj wydajność bazy danych, dlatego ważne jest profilowanie, oraz optymalizowanie zapytań i kwerend, a dzięki np. takim narzędziom jak NewRelic jesteśmy w stanie sprawdzać wydajność całej aplikacji, łącznie z monitorowaniem bazy danych — Magento również posiada out of the box integrację z NR. Średni i duzi klienci zwracają także uwagę na wersję Enterprise, która dodaje nowe funkcjonalności i poprawia jeszcze bardziej skalowalność — nawet 50% względem wersje Community.

Sami twórcy Magento, szczycą się niespotykaną w innych platformach skalowalnością ich oprogramowania. Dlatego też względem wersji Community został kilkukrotnie zoptymalizowany panel administracyjny, ale największa różnica leży po stronie właśnie baz danych, ponieważ w wersji EE została zapewniona zgodność z klastrem MySQL. Dodatkowo możliwe jest zastosowanie oddzielnych baz danych — osobno dla katalogu, checkoutu, zamówień itp., w tym każda główna baza danych może posiadać wiele baz podrzędnych (master/slave). Magento Enterprise zapewnia także natywne wsparcie dla RabbitMQ do asynchronicznej obsługi kolejek, aczkolwiek od wersji 2.3 będzie również dostępne to w wersji Community. Ostatnim aspektem jest sama infrastruktura serwerowa — dlatego takim podstawowym rozwiązaniem stosowanym w naszych wdrożeniach jest Load Balancing z HAProxy, odseparowywanie bazy danych na osobny serwer, a także wdrażany ostatnimi czasy Kubernetes.

Odpowiada Tymoteusz Hajder, Snowdog:

Wydaje mi się, że nie istnieje tutaj uniwersalna recepta konfiguracji oraz narzędzi, która będzie perfekcyjna dla każdego z systemów. Każdy sklep bazujący na Magento traktowałbym jako osobny organizm cechujący się pewnymi właściwościami, co czyni go w pewien sposób niepowtarzalnym. Magento posiada wiele warstw odpowiedzialnych za przyspieszenie działania platformy (m.in. rozbudowany cache, wstępne generowanie złożonych zależności dla takich obiektów jak fabryki, klasy proxy, czy też klas repozytorium itd… ), jednakże przy większym ruchu trzeba się liczyć, że to będzie za mało… Na pomoc jednak przychodzą technologie, takie jak Varnish, Redis, Memcache, RabbitMQ, czy też noSQL’owe bazy danych. W zależności od potrzeb dobieramy odpowiednie narzędzia, które likwidują kolejne z barier obsługi ruchu sieciowego, jak i również skalowalności.

Odpowiada Patryk Święczkowski, Sii Polska:

Podstawą oczywiście jest używanie cache (Varnish + Redis) oraz przemyślany kod. Pisząc dane rozszerzenie, funkcjonalność, gdzieś z tyłu głowy trzeba pamiętać, aby nasze rozwiązanie nie tylko działało, ale i było optymalne. Być może nie musimy odwoływać się do obiektu kolekcji za każdym razem? Przykładem niech będzie sklep Reserved, który w okolicach wyprzedaży ma ok 10k odwiedzin na sekundę. Nawet przy 4 serwerach FE i 2 BE, przy nieoptymalnym fragmencie kodu potrafi się szybko zawiesić. Pamiętam akcje, gdzie wąskim gardłem okazała się z pozoru drobna zmiana w mechanizmie kodów rabatowych. Zamiana kolejności w pętli walidacji okazała się zbawienna.

Dobrym narzędziem do analizy krytycznych miejsc jest np. New Relic / Blackfire, co pozwala optymalizować odpowiednie miejsca Magento. Do tego mamy szereg testów wydajnościowych z użyciem np. Apache JMeter, Siege czy Gatling.io. Magento samo w sobie też wypuszcza kolejne wersje, które o dziwo mają wzrost wydajności i to znaczący (1.x jak i 2.x), tak że warto być na bieżąco. Nie mówiąc już o przejściu z Magento 1 na 2.

Pytanie #3. Dlaczego Magento a nie Sylius, Presta, ORO…?

Odpowiada Mateusz Bukowski, Divante:

Magento jest dojrzałą platformą e-commerce. Cały czas się rozwija, z każdą nową wersją otrzymujemy nowe funkcjonalności. Twórcy dbają również o bezpieczeństwo aplikacji, dlatego błędy bezpieczeństwa traktowane są z najwyższym priorytetem. Jednak prawdziwa potęga tak naprawdę tkwi w społeczności Magento oraz Marketplace. Magento jako oprogramowanie Open Source zyskało naprawę dużą rzeszę ludzi, którzy każdego dnia rozwijają platformę. Liczba osób kontrybujących Magento stale rośnie, ja sam wraz ze współpracownikami aktywnie bierzemy udział w jej rozwoju. Dodatkowo, coraz lepsza dokumentacja, coraz więcej stron, forum oraz ogólnych materiałów, sprawia że Magento staje się nie tylko coraz łatwiejsze do poznania przez klientów, ale także łatwiejsze dla developerów oraz może być pewnym kierunkiem w rozwoju kariery zawodowej. Na ten moment liczba ofert pracy dla programistów Magento jest naprawdę spora.

Druga sprawa to Marketplace. Ze względu na modularną architekturę, ludzie a także firmy stale rozszerzają podstawowe funkcjonalności Magento o nowe moduły, niestandardowe rozwiązania. Na chwilę obecną możemy znaleźć moduł w zasadzie na większość customowych rozwiązań. Bez problemu możemy rozszerzyć nasz sklep o obsługę nowych płatności, dodanie nowych funkcjonalności koszyka. Dla klientów biznesowych wisienką na torcie może być również moduł B2B, tworzony i rozwijany przez samych twórców Magento, dodający obsługę firm, obsługę indywidualnych cen dla klientów, oraz Magento w wersji Enterprise przeznaczonych głównie dla średnich i dużych graczy, która rozszerza podstawowe Magento Community chociażby o bardziej rozbudowaną obsługę CMS, lepszą skalowalność czy dodanie natywnej obsługi ElasticSearcha, który dodaje nam na start pełnotekstowe wyszukiwanie w naszym sklepie.

Odpowiada Tymoteusz Hajder, Snowdog:

Przede wszystkim trzeba być świadomym, jak potężne możliwości daje Magento już w bazowej, darmowej wersji, oraz tego, że Magento jest jedną z najbardziej popularnych platform eCommerce na świecie. Świadczy o tym nie tylko ilość działających na niej sklepów internetowych, ale też ogromna społeczność, która stale przykłada się do rozwoju tej platformy. Warto też wiedzieć, że jeżeli zamierzasz prowadzić mały sklep to najprawdopodobniej wszystkie z wymienionych wyżej platform będą zbyt rozbudowane i skomplikowane.

Odpowiada Patryk Święczkowski, Sii Polska:

Porównałbym to do samochodów, każdy jeździ, spełnia swoje podstawowe zadanie, ale pod maską różni się. Myślę, że po prostu Magento jest najbardziej popularne, jeśli chodzi o możliwość rozszerzenia i budowanie dużych projektów. Używają je Nike, Ford, Samsung. Na naszym rodzimym rynku Reserved, Castorama, czy CDP. Udział na rynku eCommerce również wskazuje na 25% dominację Magento. Trend ten zdaje się utrzymywać, zwłaszcza po wystartowaniu Magento 2.

Nie oznacza to oczywiście, że pozostałe platformy są „złe”, ale mogą służyć do obsługi mniej wymagających klientów, którzy chcą na szybko sprzedawać towar. Z mojego doświadczenia, prędzej czy później, programista będzie szukał wsparcia w społeczności dla danego sklepu — tu Magento ma duże wsparcie. Sylius jest mega ciekawym projektem (Symfony), który śledzę od czasu bety. Paweł Jędrzejewski oraz zespół, wykonują kawał dobrej roboty. Tak samo nasz rodzima społeczność jest mega pozytywna.

Pytanie #4. Dzisiaj w świecie software dev bardzo modne są buzzword’y tj. mikrousługi, ddd, cqrs, event sourcing… jak to wygląda w praktyce w pracy z Magento?

Odpowiada Mateusz Bukowski, Divante:

Magento co prawda jest aplikacją monolityczną, jednak w żaden sposób nie blokuje nam to możliwości korzystania z mikrousług. Dzieki Service Contracts dostępnym w Magento, a także modularnej architekturze platformy, możemy za pomocą mikrousług integrować się w dowolny sposób z aplikacją, zyskując przy tym dowolność w wyborze odpowiednich narzędzi i technologii do problemów, z którymi musimy się zmierzyć. Daje nam to również nieograniczone możliwości w stosowaniu nowoczesnych technik tj. DDD, CQRS czy też Event Sourcing. Oczywiście samo Magento wspiera rozwiązania oparte o wzorzec CQRS, Obsługuje on logikę routingu zapytań do odczytu i zapisu do odpowiednich baz danych. Programiści nie muszą wiedzieć, która konfiguracja jest używana i nie ma oddzielnych połączeń z bazą danych do odczytu i zapisu.

W ramach mikrousług, zaprzęgamy techniki miękkie, takie jak event storming, które wspierają nas podczas zbierania wymagań biznesowych.

Odpowiada Tymoteusz Hajder, Snowdog:

Przy dzisiejszym tempie rozwoju, jaki serwuje nam technologia zbyt piękne byłoby wdrażanie wszystkich nowinek na bieżąco, a te niemal codziennie „wyrastają jak grzyby po deszczu”.

Mikroserwisy sprawdzą się świetnie w przypadku gdy mierzymy się z dużym sklepem, obsługujemy potężny ruch. Dzięki nim możemy doskonale skalować nasz system, na przykład budując kolejki i obsługując poszczególne żądania. Jedną z wielu zalet mikroserwisów jest ilość kodu, którą powinny zawierać. Kończymy tutaj z klasami mającymi tysiące linii kodu, złożoną logikę i odpowiedzialność. Każdy z nich jest pewną częścią, która nie powinna mieć wpływu na resztę naszego organizmu.

Domain Driven Design w zasadzie nie jest technologią, ale bardziej podejściem do projektowania, które pomoże zaoszczędzić czas i unikać problemów podczas rozbudowy naszego systemu. Zazwyczaj porywamy się na to, co podpowie nasza głowa. Mam tu na myśli pisanie kodu, bez wstępnej analizy tego z czym będziemy pracować. Po jakimś czasie okazuje się, że nasza klasa, która miała być prostym modelem zaczyna pełnić funkcję kontrolera, czy też widoku, bądź co gorsza agreguje i przetwarza pewne dane, które nie powinno mieć z nią nic wspólnego. Myślę, że warto tutaj również nawiązać do założeń związanych z SOLID’em, dla którego DDD może być pewnym uzupełnieniem.

CQRS, Event Sourcing można by było właściwie wrzucić do jednego worka – dlaczego? Ponieważ event sourcing opiera się na Command Query Responsibility Segregation. Dzięki odseparowaniu logiki odczytu i wykonywania akcji na danych obiektach jesteśmy w stanie iść o krok dalej. Dotychczasowe wersjonowanie wartości w bazie, logi nie potrafiły tego co daje nam właśnie event sourcing – czyli odtworzenia pełnego stanu aplikacji za pomocą poszczególnych zdarzeń.

Podsumowując, uważam że wszystkie te technologie, podejścia w praktyce pracy z Magento można uznać za warte uwagi. Zespół ciągle pracuje nad implementowaniem najbardziej wartościowych wzorców do swojej platformy. Wierzę, że w przyszłości będą one fundamentami tej platformy.

Odpowiada Patryk Święczkowski, Sii Polska:

Magento, jak kot ma chodzić swoimi drogami i ma własne spojrzenie na modę — tu mamy MVVM Knockout.js, UIcomponents, czy LESS. Choć oczywiście nic nie stoi na przeszkodzie, aby móc rozszerzyć funkcjonalności poprzez mikroserwisy czy korzystać z event sourcingu. Ciekawą prezentację na MettMagento w zeszłym roku miał Valeriy Nayda (RO).

Pytanie #5. Czy i czym różni się tworzenie dedykowanych projektów od projektów na gotowej platformie?

Odpowiada Mateusz Bukowski, Divante:

Przede wszystkim największą różnicą jest tutaj fakt, że dedykowane projekty najczęściej mają zamknięty kod, a to sprawia że wiedzę na temat danej platformy mają tylko osoby, które przy tej niej pracują. Niektórzy myślą, że jeżeli zbudują aplikację od zera, to będą mieli większą kontrolę nad swoim oprogramowaniem, ale prawda jest taka, że budowanie nowego frameworka, wiąże się również z wieloma innymi aspektami, chociażby tworzeniem i pilnowaniem dokumentacji, spisywaniem architektury, dokumentowaniem API itp. Więc bez dokumentacji, w przyszłości próg wejścia dla nowych osób może być ciężki. Oczywiście zamknięty kod ma też swoje zalety, bo dzięki temu ciężej jest znaleźć błędy bezpieczeństwa, jednakże budując dedykowaną aplikację od zera trzeba uwzględnić także tzw. problemy wieku dziecięcego.

Przy gotowej platformie, taką jaką jest Magento dostajemy już naprawdę dojrzałe oprogramowanie, pozbawione krytycznych błędów. Mając całą architekturę, w sumie to tak naprawdę cały gotowy sklep, nie musimy się skupiać nad budowaniem podstaw od zera — oprogramowaniu koszyka, itp. to już jest zrobione, a my możemy skupić się na rzeczach wysoko poziomowych, jak obsługa integracji z zewnętrznymi systemami, obsługę płatności, promocji, generalnie całej tej niestandardowej funkcjonalności, która jest różna w każdym sklepie. Jeśli chodzi o dziedzinę e-commerce, to z własnego doświadczenia mogę powiedzieć, że stawianie projektów opartych o gotowe rozwiązanie jest po prostu tańsze. Oczywiście tutaj też wszystko zależy od wyboru samej platformy, ale myślę, że śmiało mogę powiedzieć, że Magento jest liderem w tej dziedzinie.

Odpowiada Tymoteusz Hajder, Snowdog:

To trochę tak, jak z gotowaniem. Możemy kupić pół-gotowy produkt, zmieszać składniki z opakowania, upiec, lub ugotować i gotowe. Mamy pewną gwarancję (postępując zgodnie z instrukcją), że proces ten zakończy się sukcesem, jednocześnie oszczędzając czas na przygotowywanie ciasta – bo przecież wyjmiemy je gotowe z paczki. Problem zaczyna się wtedy, gdy mamy gotową masę i zamiast truskawek chcemy mieć np. maliny. Można spróbować wydobyć z masy truskawki i zastąpić je malinami, lecz jest to duże wyzwanie… Lepszym rozwiązaniem byłoby znalezienie produktu, gdzie truskawki są osobnym składnikiem, który należy dodać w trakcie pieczenia.

Dokładnie tak samo wygląda praca w przypadku budowania dedykowanych projektów, czy też opieraniu ich na gotowych platformach. Gotowe, jak i niestandardowe aplikacje w większości opierają się na frameworkach, które załatwiają za nas m.in warstwy komunikacji z bazami, procesami, czy też wygląd samej platformy (po prostu ułatwiają nam życie). Jednakże w przypadku budowania projektów od A do Z mamy większy wpływ na to co i w jaki sposób zrobimy – po prostu nie jest to z góry narzucane.

Odpowiada Patryk Święczkowski, Sii Polska:

Magento jako Framework, w swojej bazowe postaci to dopiero początek „zabawy”. Wszystko zależy od tego, jak bardzo klient chciałby odejść od założeń i funkcji jakie Magento dostarcza. Mimo pewnej elastyczności i kompromisów, nie da się wszystkiego osiągnąć. Z drugiej strony, mamy już gotową działającą platformę eCommerce z dość logicznym flow order. Magento dzięki swojej różnorodności może działać i wyglądać jak Groupon, platforma do rezerwacji biletów, czy narzędzie typu ERP.

Pytanie #6. Co w Magento mogłoby być zrobione lepiej?

Odpowiada Mateusz Bukowski, Divante:

W moim osobistym odczuciu warstwa frontendu aplikacji. Magento korzysta z biblioteki KnockoutJS, która na dzień dzisiejszy jest w cieniu Reacta, Vue czy Angulara i mówiąc krótko jest przestarzała. Niestety w porównaniu do Magento 1, mi jako backend deweloperowi, praca na frontendzie zajmuje znacznie więcej czasu niż w Magento 1, a dodatkowo w dwójce pojawiło się coś takiego jak UiComponents. Pisze się je w XMLu, ściśle wykorzystuje Knockout’a do renderowania Data Gridów i formularzy, a debugowanie jak i development tego jest problematyczny i czasochłonny. Tak naprawdę w moim odczuciu Knockout broni się tylko jednym aspektem. Konceptem MVVM. Mimo to po cichu wierzę, że któregoś dnia Magento przejdzie na Reacta albo Vue.

Odpowiada Tymoteusz Hajder, Snowdog:

Myślę, że głównym problemem, z którym boryka się Magento jest ciągła optymalizacja i pewnego rodzaju dług technologiczny, który jeszcze w pewnym stopniu pozostał z pierwszej wersji — Magento 1. Wiem, że zespół pracuje na pełnych obrotach ciągle doskonaląc swój produkt, a co najważniejsze my im możemy w tym pomóc. Tak jak wspominałem wcześniej, wierzę, że w przyszłości Magento stanie się platformą bazującą na rozwiązaniach takich jak Mikroserwisy, CQRS, oraz Event Sourcing. Choć musimy być świadomi, że te technologie to tylko początek góry lodowej w tym technologicznym świecie.

Odpowiada Patryk Święczkowski, Sii Polska:

Nie ma takiej rzeczy, która nie mogłaby być zrobiona lepiej — pytanie tylko kiedy. Można podejrzeć nad czym pracuje Community, jak również zgłosić / napisać własne usprawnienie. Dla wielu osób z branży bolączką jest obcowanie z knockout.js czy UIcomponents. Świetnym posunięciem ze strony Magento byłoby użycie na froncie React/Angulara. W zeszłym roku pojawiła się ciekawa idea odnośnie PWA, ale nic daje się nie dzieje. Firma Divante, nie czekając na Magento, wprowadziła swoje rozwiązanie bazujące na Vue — to był świetny pomysł.


Devdebata to świetne miejsce do dyskusji na temat ważnych dla developerów tematów. Jeśli chcecie wziąć udział w następnej devdebacie — odezwijcie się na adres adam@justjoin.it, bądź zostawcie wiadomość w komentarzu. Chętnie poznamy Wasze propozycje na kolejne edycje devdebat. Zapraszamy też do zapoznania się z poprzednią devdebatą, w której zapytaliśmy developerów o to, co jest lepsze dla Frontend Developera: ReactJS czy Angular?

najwięcej ofert html

Zdjęcie główne artykułu pochodzi z pexels.com

Redaktor naczelny w Just Geek IT

Od pięciu lat rozwija jeden z największych polskich portali contentowych dot. branży IT. Jest autorem formatu devdebat, w którym zderza opinie kilku ekspertów na temat wybranego zagadnienia. Od 10 lat pracuje zdalnie.

Podobne artykuły

[wpdevart_facebook_comment curent_url="https://geek.justjoin.it/poradzic-wydajnoscia-magento-devdebata/" order_type="social" width="100%" count_of_comments="8" ]