Magento 2 Commerce vs. ORO Commerce Performance and architecture

Yegor Shytikov
9 min readNov 19, 2020

ORO inc. was founded by Yoav Kutner and two other Magento co-founders, Jary Carter, the company’s former Vice President of Worldwide Sales and Channel, and Dmitry Soroka, its former lead architect. They said they created the company because there was no existence with Magento 2 performance and bad architectural decisions. In one of his interview Yoav Kutner told:

Magento was a great experience for us since we learned what works well and not so well. We saw first hand what markets were underserved and had to make compromises. At one point, I asked myself, “if we were to do it again, what would we do differently?” So at Oro, we approached technology differently — a lot of advancements had happened since then, and we had more confidence in our abilities.

We chose to maintain ownership of our product but didn’t reinvent the wheel when a better alternative was available. The decision to build on PHP’s Symfony framework is a perfect example.

Yoav Kutner

Former Magento team members are demanded in the eCommerce market because they know how not to build platforms.

Oro Commerce uses Symfony is the most mature PHP framework that provides a wide range of functions that are typical for any web application. Symfony takes care of numerous tasks, for instance:

Receiving a user request and transforming it into a response for the user’s browser

Organizing the source code in a conventional structure

Providing tools for continuous storage of application data, validation of income data against some set of rules.

Using Symfony allows web applications to avoid the development of low-level components responsible for the organization of the application and focus on developing a specific functionality specific to an eCommerce web application.

Oro widely uses Symfony conventions to configure the application and certain YAML features ( possibly to use PHP, JSON, XML) configuration files.

On the application level (according to Symfony conventions), the configuration is divided into infrastructure-related (config/parameters.yml) and application-related (config/config.yml file).

On the bundle level, Oro applications have small changes in the technologies of configuration but a considerable shift in the role and purpose of the configuration files.

Symfony Templating is widely extended in Oro Applications by the Layouts Magento concept, which allows addressing Symfony’s limitations in UI extension and composition.

However, all the TWIG templating engine and Symfony Templating Component features are widely used in Oro applications in UI building.

Databases Management (Doctrine ORM)

Oro Commerce versus Magento has mature and modern ORM.

Oro applications support the storage of application data in relational databases, such as MySQL, MariaDB, PostgreSQL, EnterpriseDB, Oracle.

Oro applications widely use all Doctrine features to manage persistent data: Database Abstraction Layer, Object Relation Mapping, Event Manager, etc.

However, Doctrine Migrations, was entirely replaced by proprietary. This was done in order to allow versioning management of the databases scheme using specific migration classes on the bundle level, not the application level.

Supports DQL – proprietary object-oriented SQL dialect called Doctrine Query Language implemented in Doctrine ORM:

$query = $dql->createQuery(‘SELECT u.name FROM CmsUser u WHERE u.id BETWEEN ?1 AND ?2');$query->setParameter(1, 123);$query->setParameter(2, 321);$usernames = $query->getResult();

Goodbye EAV

Oro not using EAV, applying custom fields to schema. Flat Catalog by default without wired indexes.

A serialized field is stored as additional data on an entity (e.g., a product or customer) and is meant for purely descriptive information. Oro's big advantage is that serialized fields can be created without the need for a schema update.

You have the next storage types:

1. Serialized fields cannot be used for grid filters, reporting, chart generation, data audit, or creating segments and relations.

Serialized fields cannot be used for files, multi-selects, or option sets.

2. Table Column store field values to a database table. A schema update is necessary for this field to be available. Save everything in an optimal way without EAV.

OroCrm Performance

So there is no reason to use an antiquated Magento 2 framework. The 2 best and most modern PHP frameworks like Symfony.

PHP eCommerce technology trends 2020:

Zend and Magento 2 are dead technologies nowadays.

Magento 2 frontend architecture is totally a failure. You can’t use Magento with other JS libraries than the broken Magento UI library based on XML, LESS, KnockoutJS, JQuery, PrototypeJS, ExtJS, and RequireJS.

Oro has a modern and easy to customize frontend. It uses Webpack 4 watch mode to automatically recompile and rebuild Oro frontend output whenever you change any application files.

Oro uses modern SASS CSS preprocessor vs. M2 LESS CSS

Libraries used by OroPlatform on the client-side:

  • jQuery + jQuery-UI
  • Bootstrap
  • Backbone + underscore 8KB
  • Chaplin 20K

Overall JS bundle size around 60K vs. Magento’s 3MB JS bundle.

Java Script stack is not bloated and can be easily extended by any modern framework.

When with Magento, you are stuck with its UI customizations and development.

eCommerce Cloud offering

Also, ORO Commerce provides really great cloud infrastructure as a service. When Magento offers a silly cloudy solution that doesn’t work at all.

What this beautiful diagram:

It has several layers of responsibilities and also greater Networking. Magento Commerce Cloud just reselling several static instances managed by WordPress hosting solution Platform.SH connected by Fastly. Waht a scam!

ORO Cloud has:

Web Nodes Servers

Google Load Balancer distributes the incoming traffic to a set of web nodes that enable on-demand scaling, fault tolerance, DDoS protection, etc. At least two web nodes are allocated in different zones for fault-tolerance.

Search Index

To speed up the search, Oro application data is indexed according to the application configurations and stored in the search index. As a search index provider, OroCloud instances use ElasticSearch which provides cluster architecture out-of-the-box as well as the ability to add more nodes to clusters to spread the load and enhance reliability.

Database

Oro application data is stored in the enterprise-grade PostgreSQL relational database. Each environment has at least two dedicated PostgreSQL instances, one in the main zone and another in the secondary zone. If the instance in the main zone becomes unresponsive, the environment automatically switches to the secondary zone enabling the database failover.

Magento Cloud running MySQL on the same server with Crons, PHP-FPM, REDIS, ElasticSearch. What a shame! Just a modern days cloud scam service offering...

Oro Commerce vs. Magento 2.4 performance

eCommerce Scenarios tested:

Test Scenarios:

  1. Category page, PLP
  2. Search
  3. Product Page, PDP
  4. Test CMS page — “Hello World!” test

Why Benchmarking “Hello, World!”?

There is a lot to be learned from careful observation of a program and its complete Magento surrounding context, even one as “trivial” as HelloWorld.

If you substitute for HelloWorld a nontrivial Magento controller, you can learn even more about Magento 2 and ORO Commerce and its execution on a server.

We will run each test 20 times with 1 concurrent user and gather minimum, average, 95% percentile, and maximum page server-side rendering metrics.

Magento 2 Category Page Performance

INFO[0012] Tested URL: /collections/performance-fabrics.html  source=consolerunning (00m11.5s), 0/1 VUs, 20 complete and 0 interrupted iterations
default ✓ [======================================] 1 VUs 00m11.4s/10m0s 20/20 shared iters
█ setup█ teardowndata_received..............: 5.0 MB 439 kB/s
data_sent..................: 2.8 kB 244 B/s
http_req_blocked...........: min=4.43µs med=4.84µs avg=16.87µs max=241.13µs p(95)=18.26µs
http_req_connecting........: min=0s med=0s avg=9.42µs max=188.41µs p(95)=9.42µs
http_req_duration..........: min=336.15ms med=354.05ms avg=370.79ms max=594.44ms p(95)=449.83ms
http_req_receiving.........: min=1.53ms med=2.17ms avg=3.01ms max=10.79ms p(95)=5.84ms
http_req_sending...........: min=22.52µs med=25.21µs avg=28.83µs max=84.56µs p(95)=44.09µs
http_req_tls_handshaking...: min=0s med=0s avg=0s max=0s p(95)=0s
http_req_waiting...........: min=334.07ms med=351.95ms avg=367.75ms max=583.62ms p(95)=447.09ms
http_reqs..................: 20 1.741933/s
iteration_duration.........: min=123.48µs med=552.87ms avg=519.47ms max=795.11ms p(95)=640.39ms

Result:

min: 334 ms

med: 351 ms

avg: 367 ms

max: 587 ms

percentile 96: 447ms

ORO Commerce Category Page Performance

Tested URL: /navigation-root/products/by-category/industrial/lighting-products  source=consolerunning (00m03.7s), 0/1 VUs, 10 complete and 0 interrupted iterations
default ✓ [======================================] 1 VUs 00m03.7s/10m0s 10/10 shared iters
█ setup█ teardowndata_received..............: 2.5 MB 668 kB/s
data_sent..................: 14 kB 3.7 kB/s
http_req_blocked...........: min=281ns med=531ns avg=7.5ms max=75.06ms p(95)=41.28ms
http_req_connecting........: min=0s med=0s avg=21.21µs max=212.15µs p(95)=116.68µs
http_req_duration..........: min=251.12ms med=257.68ms avg=259.41ms max=270.43ms p(95)=269.27ms
http_req_receiving.........: min=757.61µs med=852.38µs avg=1.01ms max=2.06ms p(95)=1.65ms
http_req_sending...........: min=22.51µs med=30.3µs avg=36.2µs max=98.85µs p(95)=72.63µs
http_req_tls_handshaking...: min=0s med=0s avg=180.72µs max=1.8ms p(95)=993.96µs
http_req_waiting...........: min=250.21ms med=256.72ms avg=258.37ms max=269.58ms p(95)=268.42ms
http_reqs..................: 10 3.698205/s
iteration_duration.........: min=98.93µs med=258.09ms avg=306.13ms max=431.11ms p(95)=397.97ms

Results:

min: 250.21 ms

med: 256.72 ms

avg: 258.37 ms

max: 269.58 ms

percentile 95: 268.42 ms

Magento 2 Search Performance

Tested URL: /catalogsearch/result/?q=shirt  source=consolerunning (00m10.7s), 0/1 VUs, 20 complete and 0 interrupted iterations
default ✓ [======================================] 1 VUs 00m10.6s/10m0s 20/20 shared iters
█ setup█ teardowndata_received..............: 2.2 MB 201 kB/s
data_sent..................: 2.7 kB 249 B/s
http_req_blocked...........: min=4.61µs med=5.18µs avg=19.08µs max=275.19µs p(95)=22.91µs
http_req_connecting........: min=0s med=0s avg=10.87µs max=217.57µs p(95)=10.87µs
http_req_duration..........: min=299.96ms med=321.33ms avg=330.51ms max=428.45ms p(95)=367.26ms
http_req_receiving.........: min=2.59ms med=5.06ms avg=5.59ms max=14.12ms p(95)=8.35ms
http_req_sending...........: min=22.6µs med=25.04µs avg=28.03µs max=83.85µs p(95)=32.11µs
http_req_tls_handshaking...: min=0s med=0s avg=0s max=0s p(95)=0s
http_req_waiting...........: min=294.18ms med=314.65ms avg=324.88ms max=422.23ms p(95)=363.49ms
http_reqs..................: 20 1.8725/s
iteration_duration.........: min=137.72µs med=520.42ms avg=482.88ms max=628.99ms p(95)=564.3ms

Results:

min: 294.18 ms

med: 314.65 ms

avg: 324.88 ms

max: 422.23 ms

percentile 95: 363.49 ms

ORO Search Performance

Tested URL: /product/search?search=light  source=consolerunning (00m05.0s), 0/1 VUs, 10 complete and 0 interrupted iterations
default ✓ [======================================] 1 VUs 00m05.0s/10m0s 10/10 shared iters
█ setup█ teardowndata_received..............: 6.5 MB 1.3 MB/s
data_sent..................: 33 kB 6.6 kB/s
http_req_blocked...........: min=262ns med=572ns avg=242.32µs max=2.41ms p(95)=1.33ms
http_req_connecting........: min=0s med=0s avg=17.79µs max=177.97µs p(95)=97.88µs
http_req_duration..........: min=485.27ms med=498.38ms avg=500.17ms max=528.94ms p(95)=520.57ms
http_req_receiving.........: min=1.85ms med=2.21ms avg=2.41ms max=4.03ms p(95)=3.49ms
http_req_sending...........: min=21.94µs med=26.95µs avg=33.97µs max=99.87µs p(95)=71.44µs
http_req_tls_handshaking...: min=0s med=0s avg=178.48µs max=1.78ms p(95)=981.65µs
http_req_waiting...........: min=283.38ms med=296.37ms avg=297.72ms max=324.8ms p(95)=317.06ms
http_reqs..................: 10 2.986672/s
iteration_duration.........: min=106.61µs med=394.5ms avg=317.35ms max=431.79ms p(95)=420.22ms

Result:

min: 283.38 ms

med: 296.37 ms

avg: 297.72 ms

max: 324.8ms

percentile 95: 317.06 ms

Magento 2 Product Page Simple Performance, PDP

Tested URL: /didi-sport-watch.html  source=consolerunning (00m09.2s), 0/1 VUs, 20 complete and 0 interrupted iterations
default ✓ [======================================] 1 VUs 00m09.2s/10m0s 20/20 shared iters
█ setup█ teardowndata_received..............: 1.2 MB 133 kB/s
data_sent..................: 2.5 kB 271 B/s
http_req_blocked...........: min=4.69µs med=5.27µs avg=19.08µs max=279.47µs p(95)=22.47µs
http_req_connecting........: min=0s med=0s avg=10.07µs max=201.47µs p(95)=10.07µs
http_req_duration..........: min=248.29ms med=251.61ms avg=260.13ms max=408.41ms p(95)=268.09ms
http_req_receiving.........: min=937.24µs med=1.17ms avg=1.59ms max=4.12ms p(95)=3.8ms
http_req_sending...........: min=22.03µs med=24.65µs avg=28.83µs max=94.81µs p(95)=33.45µs
http_req_tls_handshaking...: min=0s med=0s avg=0s max=0s p(95)=0s
http_req_waiting...........: min=247.29ms med=250.14ms avg=258.51ms max=407.23ms p(95)=266.33ms
http_reqs..................: 20 2.165153/s
iteration_duration.........: min=121.41µs med=451.88ms avg=418.87ms max=608.98ms p(95)=461.11ms

Result:

min: 247.29 ms

med: 250.14 ms

avg: 258.51 ms

max: 407.23 ms

percentile 95: 266.33 ms

ORO Commerce Product Page Performance

Tested URL: navigation-root/products/by-category/industrial/lighting-products/_item/industrial-handheld-flashlight  source=consolerunning (00m03.1s), 0/1 VUs, 10 complete and 0 interrupted iterations
default ✓ [======================================] 1 VUs 00m03.1s/10m0s 10/10 shared iters
█ setup█ teardowndata_received..............: 1.8 MB 571 kB/s
data_sent..................: 10 kB 3.3 kB/s
http_req_blocked...........: min=265ns med=512ns avg=238.54µs max=2.38ms p(95)=1.3ms
http_req_connecting........: min=0s med=0s avg=18.54µs max=185.49µs p(95)=102.02µs
http_req_duration..........: min=200.96ms med=206.06ms avg=209.93ms max=233.38ms p(95)=224.73ms
http_req_receiving.........: min=597.66µs med=695.84µs avg=827.46µs max=1.93ms p(95)=1.45ms
http_req_sending...........: min=24.98µs med=31.76µs avg=38.96µs max=108.59µs p(95)=76.67µs
http_req_tls_handshaking...: min=0s med=0s avg=180.02µs max=1.8ms p(95)=990.11µs
http_req_waiting...........: min=200.31ms med=205.3ms avg=209.06ms max=231.34ms p(95)=223.32ms
http_reqs..................: 10 3.186143/s
iteration_duration.........: min=104.77µs med=205.97ms avg=258.84ms max=236.29ms p(95)=224.35ms

Results:

min: 200.31 ms

med: 205.3 ms

avg: 209.06 ms

max: 231.34 ms

percentile 95: 223.32 ms

Magento 2 CMS Page Hello World TEST

Tested URL: /customer-service  source=consolerunning (00m07.3s), 0/1 VUs, 20 complete and 0 interrupted iterations
default ✓ [======================================] 1 VUs 00m07.3s/10m0s 20/20 shared iters
█ setup█ teardowndata_received..............: 712 kB 97 kB/s
data_sent..................: 2.4 kB 328 B/s
http_req_blocked...........: min=4.58µs med=5.28µs avg=19.09µs max=279.85µs p(95)=20.35µs
http_req_connecting........: min=0s med=0s avg=10.1µs max=202.11µs p(95)=10.1µs
http_req_duration..........: min=157.49ms med=159.28ms avg=164.45ms max=261.55ms p(95)=167.27ms
http_req_receiving.........: min=682.58µs med=829.21µs avg=1ms max=2.44ms p(95)=1.92ms
http_req_sending...........: min=22.41µs med=24.03µs avg=28.26µs max=89.67µs p(95)=43.27µs
http_req_tls_handshaking...: min=0s med=0s avg=0s max=0s p(95)=0s
http_req_waiting...........: min=156.45ms med=158.28ms avg=163.41ms max=260.65ms p(95)=165.39ms
http_reqs..................: 20 2.727626/s
iteration_duration.........: min=132.59µs med=359.65ms avg=331.88ms max=462.15ms p(95)=362.75ms

Result:

min: 156.45 ms

med: 158.28 ms

avg: 163.41 ms

max: 260.65 ms

percentile 95: 165.39ms

ORO Commerce CMS Page Hello World TEST

Tested URL: /about  source=consolerunning (00m01.6s), 0/1 VUs, 10 complete and 0 interrupted iterations
default ✓ [======================================] 1 VUs 00m01.5s/10m0s 10/10 shared iters
█ setup█ teardowndata_received..............: 523 kB 332 kB/s
data_sent..................: 3.7 kB 2.4 kB/s
http_req_blocked...........: min=282ns med=475ns avg=238.66µs max=2.38ms p(95)=1.31ms
http_req_connecting........: min=0s med=0s avg=18.28µs max=182.8µs p(95)=100.54µs
http_req_duration..........: min=118.39ms med=113.34ms avg=133.41ms max=147.32ms p(95)=147.22ms
http_req_receiving.........: min=118.13µs med=178.23µs avg=177.25µs max=223.22µs p(95)=221.85µs
http_req_sending...........: min=21.28µs med=28.35µs avg=37.91µs max=90.9µs p(95)=70.32µs
http_req_tls_handshaking...: min=0s med=0s avg=177.29µs max=1.77ms p(95)=975.12µs
http_req_waiting...........: min=98.15ms med=108.16ms avg=113.19ms max=127.14ms p(95)=117.03ms
http_reqs..................: 10 6.362119/s
iteration_duration.........: min=103.99µs med=113.76ms avg=108.41ms max=137.72ms p(95)=147.6ms

Result:

min: 108.15 ms

med: 98.16 ms

avg: 113.19 ms

max: 127.14 ms

percentile 95: 117.03 ms

Pivot Table

+-----------------+-------------+--------------+
| | Magento 2.4 | ORO Commerce |
+-----------------+-------------+--------------+
| Simple Product | 266.33 | 223.32 |
+-----------------+-------------+--------------+
| Hello World | 260.65 | 127.14 |
+-----------------+-------------+--------------+
| Category | 447 | 268.42 |
+-----------------+-------------+--------------+
| Search | 422.23 | 324.8 |
+-----------------+-------------+--------------+
ORO Commerce VS Magento 2.4 performance

Difficult to find a solution on the market that’s slower than Magento 2.

--

--

Yegor Shytikov

True Stories about Magento 2. Melting down metal server infrastructure into cloud solutions.