SlideShare une entreprise Scribd logo
1  sur  38
Performance Case Study
          @Fabian_Frank
       <fabian@pagefault.de>

       Yahoo! Search, Engineer
      Youthmedia.eu,Volunteer
A Dynamic Website
self-contained App
self-contained App
self-contained App
node v0.4.X
                                   multi-core




http://developer.yahoo.com/blogs/ydn/posts/2010/07/multicore_http_server_with_nodejs/
Time Sharing

• Workers

• Event Queue
Event Queue
• does only one thing at a time

• events that occur are queued for
  processing


• after an event was processed the next one
  is fetched from the queue
The difference
   Workers                    Event Queue

1. synchronous call        1. asynchronous call that
                              specifies event(s) that can
2. worker blocked             occur (callback)

3. periodically check if   2. process next event
   worker can go ahead
                           3. specified event occurs and
4. call returns               is put on the queue

5. worker goes ahead on    4. process goes ahead
   next check
Another difference

  Workers               Event Queue

• 1 connection per    • N connections per
  worker                process

• N workers per CPU   • 1 process (per CPU)
Regarding...
• static file serving benchmarks
 • are not relevant, unless you plan to do
    heavy duty static file serving (I’m not)
• hello world benchmarks
 • still ignore most of what matters, e.g.
    accessing a database or other back-ends
Realistic
Real World Benchmark
• a lot of variables that have to be controlled
• more complex, likely to surface weird bugs
• face unanswerable questions
• are expensive to do
• are easy to attack, but hard to defend
My Reasoning

• “I can not compare everything out there
  against everything else. But I can compare
  what I want to use in the future against what
  I am using today.”
Search Case Study
• Right Panel retrieved using AJAX
• { ‘html’: ‘<div>...</div>’, ‘css’: ‘...’, ‘js:’ ‘...’, ... }
Refresh Right Panel
1. receive a request                    JSON API

2. call a JSON API over HTTP                     2.
3. manipulate the data structure         Node.js 3.
                                                   4.
4. render it as HTML using Mustache   1.        5.
5. write back wrapped in JSON            Client
Refresh Right Panel
1. receive a request                   JSON API

2. call a JSON API over HTTP                     2.
3. manipulate the data structure             xy 3.
                                          ro 4.
                                         Node.js
                                         P
4. render it as HTML using Mustache   1.        5.
5. write back wrapped in JSON            Client
Constraints

• Network bandwidth and latency
 • Gigabit and 1ms

• JSON API performance
 • load-balanced cluster with cache
Implementations

• Apache + PHP

• Node.js (+ YUI)

• Manhattan + Mojito
Apache + PHP

• works, in production for decades
• initial response times are “good enough”
• scales, but you need $$$
• baseline to get a feeling for the numbers
Apache + PHP


• 430req/s @ 60ms average latency
 • 99% @ 114ms
Node.js (+ YUI)

• works, but very new and untested stack
• initial response times are very low
• scales extremely well
• YUI works well, but still has pitfalls
Node.js Fun Facts
• >3100 requests per second
 • 100k requests in 32s
 • 9MByte/s network traffic

• serve >2k req/s at 20ms average latency
 • 99% @ 47ms
Node.js
Node.js
Node.js Histogram
~1500req/s | 25 conc.
    12000


                                                                               99% @ 35ms
    10000




        8000
frequency




        6000




        4000




        2000




            0
                11.000 - 17.300 - 23.600 - 29.900 - 36.200 - 42.500 - 48.800 - 55.100 - 61.400 - 67.700 - 74.000 -
                 17.300 23.600 29.900 36.200 42.500 48.800 55.100 61.400 67.700 74.000 80.300
Node.js Histogram
            ~2900/s | 100 conc.
        9000


        8000
                                                                                99% @ 79ms
        7000


        6000
frequency




        5000


        4000


        3000


        2000


        1000


            0
                12.000 - 22.000 - 32.000 - 42.000 - 52.000 - 62.000 - 72.000 - 82.000 - 92.000 - 102.000 - 112.000 -
                 22.000 32.000 42.000 52.000 62.000 72.000 82.000 92.000 102.000 112.000 122.000
Node.js Histogram
            ~3100/s | 200 conc.
        8000



        7000
                                                                                99% @ 152ms
        6000



        5000
frequency




        4000



        3000



        2000



        1000



            0
                14.000 - 33.900 - 53.800 - 73.700 - 93.600 - 113.500 - 133.400 - 153.300 - 173.200 - 193.100 - 213.000 -
                 33.900 53.800 73.700 93.600 113.500 133.400 153.300 173.200 193.100 213.000 232.900
Manhattan + Mojito

• works, but extremely new and untested
  stack
• initial response times are low (60%
  compared to Apache/PHP)
• scales well (twice as good as Apache/PHP)
Manhattan + Mojito
Manhattan + Mojito
Findings
• Both node.js implementations scale linearly
  before CPU usage hits 100%
• Node.js scales extremely well as proxy
• Manhattan and Mojito can perform better
  than Apache and PHP (for this use case)
• Node.js applications are very sensitive to
  memory leaks or complex/blocking code
DNS in Node.js
• getaddrinfo() sys call is synchronous
 • gethostbyname() is, too
• ares_gethostbyname() is asynchronous
 • no cache
• node 0.6 uses a getaddrinfo() thread pool,
  but still relies on ares for other calls
Cocktails

• Manhattan

• Mojito
Manhattan?

   • Yahoo!’s Node.js cloud
   • can run any node.js application
   • allows calls to HTTP APIs (e.g.YQL)
   • deployment of versioned apps
   • apps can specify their environment
http://developer.yahoo.com/blogs/ydn/posts/2011/11/yahoo-announces-cocktails-%E2%80%93-shaken-not-stirred/
Mojito?
   • Yahoo!‘s Node.js MVC framework
   • provides identical similar runtime for your
         code on the client and server
   • contains all server- and client-side code
   • built on top of YUI
   • will be open sourced
http://developer.yahoo.com/blogs/ydn/posts/2011/11/yahoo-announces-cocktails-%E2%80%93-shaken-not-stirred/
The Cocktails way
Mojito Application

Mojit
                        Assets
  Model                 Client JS   Images
           Controller

  View                    CSS         ...
Conclusion
• Node.js can serve hundreds of concurrent
  requests quickly and reliable, “better” than
  Apache/PHP
• It scales extremely well for I/O bound use
  cases
• It tears down the client-server language
  barrier, opening new architectural
  possibilities
Thank you!




Picture: "Esther Müller" / www.jugendfotos.de, CC-License(by-nc)

Contenu connexe

Tendances

19 chronic%20 gvhd[1]
19 chronic%20 gvhd[1]19 chronic%20 gvhd[1]
19 chronic%20 gvhd[1]
amc_editorial
 
Complications from radiation therapy to the head and neck by D. Fliss
Complications from radiation therapy to the  head and neck by D. FlissComplications from radiation therapy to the  head and neck by D. Fliss
Complications from radiation therapy to the head and neck by D. Fliss
Eurasian Federation of Oncology
 

Tendances (14)

Tongue cancer
Tongue cancerTongue cancer
Tongue cancer
 
Tongue carcinoma
Tongue carcinomaTongue carcinoma
Tongue carcinoma
 
Tissue expansion- principles and techniques
Tissue expansion- principles and techniquesTissue expansion- principles and techniques
Tissue expansion- principles and techniques
 
Skin-Grafting-and-Flaps-complete-presentation.pptx
Skin-Grafting-and-Flaps-complete-presentation.pptxSkin-Grafting-and-Flaps-complete-presentation.pptx
Skin-Grafting-and-Flaps-complete-presentation.pptx
 
19 chronic%20 gvhd[1]
19 chronic%20 gvhd[1]19 chronic%20 gvhd[1]
19 chronic%20 gvhd[1]
 
Ortichochea three flap scalp reconstruction by Dr Ali Mujtaba
Ortichochea three flap scalp reconstruction by Dr Ali Mujtaba Ortichochea three flap scalp reconstruction by Dr Ali Mujtaba
Ortichochea three flap scalp reconstruction by Dr Ali Mujtaba
 
Oral cavity cancer
Oral cavity cancerOral cavity cancer
Oral cavity cancer
 
Schwannomas of parapharyngeal space
Schwannomas of parapharyngeal spaceSchwannomas of parapharyngeal space
Schwannomas of parapharyngeal space
 
Oral caner
Oral canerOral caner
Oral caner
 
Gorlin goltz syndrome
Gorlin goltz syndromeGorlin goltz syndrome
Gorlin goltz syndrome
 
Carcinoma tongue
Carcinoma tongueCarcinoma tongue
Carcinoma tongue
 
Complications from radiation therapy to the head and neck by D. Fliss
Complications from radiation therapy to the  head and neck by D. FlissComplications from radiation therapy to the  head and neck by D. Fliss
Complications from radiation therapy to the head and neck by D. Fliss
 
WOUND CARE NURSE
WOUND CARE NURSEWOUND CARE NURSE
WOUND CARE NURSE
 
Scalp defects
Scalp defectsScalp defects
Scalp defects
 

Similaire à Node.js Performance Case Study

Intro to node and mongodb 1
Intro to node and mongodb   1Intro to node and mongodb   1
Intro to node and mongodb 1
Mohammad Qureshi
 
Node js quick tour v2
Node js quick tour v2Node js quick tour v2
Node js quick tour v2
Wyatt Fang
 
Efficient use of NodeJS
Efficient use of NodeJSEfficient use of NodeJS
Efficient use of NodeJS
Yura Bogdanov
 

Similaire à Node.js Performance Case Study (20)

Usenix LISA 2012 - Choosing a Proxy
Usenix LISA 2012 - Choosing a ProxyUsenix LISA 2012 - Choosing a Proxy
Usenix LISA 2012 - Choosing a Proxy
 
introduction to node.js
introduction to node.jsintroduction to node.js
introduction to node.js
 
Planning to Fail #phpne13
Planning to Fail #phpne13Planning to Fail #phpne13
Planning to Fail #phpne13
 
20120306 dublin js
20120306 dublin js20120306 dublin js
20120306 dublin js
 
Intro to node and mongodb 1
Intro to node and mongodb   1Intro to node and mongodb   1
Intro to node and mongodb 1
 
Loom promises: be there!
Loom promises: be there!Loom promises: be there!
Loom promises: be there!
 
Node.js: The What, The How and The When
Node.js: The What, The How and The WhenNode.js: The What, The How and The When
Node.js: The What, The How and The When
 
20120514 nodejsdublin
20120514 nodejsdublin20120514 nodejsdublin
20120514 nodejsdublin
 
End-to-end W3C APIs - tpac 2012
End-to-end W3C APIs - tpac 2012End-to-end W3C APIs - tpac 2012
End-to-end W3C APIs - tpac 2012
 
Memory Issues in Ruby on Rails Applications
Memory Issues in Ruby on Rails ApplicationsMemory Issues in Ruby on Rails Applications
Memory Issues in Ruby on Rails Applications
 
Node js quick-tour_v2
Node js quick-tour_v2Node js quick-tour_v2
Node js quick-tour_v2
 
Node js quick-tour_v2
Node js quick-tour_v2Node js quick-tour_v2
Node js quick-tour_v2
 
Node js quick tour v2
Node js quick tour v2Node js quick tour v2
Node js quick tour v2
 
Exploring Twitter's Finagle technology stack for microservices
Exploring Twitter's Finagle technology stack for microservicesExploring Twitter's Finagle technology stack for microservices
Exploring Twitter's Finagle technology stack for microservices
 
Node.js meetup at Palo Alto Networks Tel Aviv
Node.js meetup at Palo Alto Networks Tel AvivNode.js meetup at Palo Alto Networks Tel Aviv
Node.js meetup at Palo Alto Networks Tel Aviv
 
Server-Side JavaScript Developement - Node.JS Quick Tour
Server-Side JavaScript Developement - Node.JS Quick TourServer-Side JavaScript Developement - Node.JS Quick Tour
Server-Side JavaScript Developement - Node.JS Quick Tour
 
Developing realtime apps with Drupal and NodeJS
Developing realtime apps with Drupal and NodeJS Developing realtime apps with Drupal and NodeJS
Developing realtime apps with Drupal and NodeJS
 
Celery: The Distributed Task Queue
Celery: The Distributed Task QueueCelery: The Distributed Task Queue
Celery: The Distributed Task Queue
 
Planning to Fail #phpuk13
Planning to Fail #phpuk13Planning to Fail #phpuk13
Planning to Fail #phpuk13
 
Efficient use of NodeJS
Efficient use of NodeJSEfficient use of NodeJS
Efficient use of NodeJS
 

Dernier

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 

Dernier (20)

Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 

Node.js Performance Case Study

  • 1. Performance Case Study @Fabian_Frank <fabian@pagefault.de> Yahoo! Search, Engineer Youthmedia.eu,Volunteer
  • 6. node v0.4.X multi-core http://developer.yahoo.com/blogs/ydn/posts/2010/07/multicore_http_server_with_nodejs/
  • 8. Event Queue • does only one thing at a time • events that occur are queued for processing • after an event was processed the next one is fetched from the queue
  • 9. The difference Workers Event Queue 1. synchronous call 1. asynchronous call that specifies event(s) that can 2. worker blocked occur (callback) 3. periodically check if 2. process next event worker can go ahead 3. specified event occurs and 4. call returns is put on the queue 5. worker goes ahead on 4. process goes ahead next check
  • 10. Another difference Workers Event Queue • 1 connection per • N connections per worker process • N workers per CPU • 1 process (per CPU)
  • 11. Regarding... • static file serving benchmarks • are not relevant, unless you plan to do heavy duty static file serving (I’m not) • hello world benchmarks • still ignore most of what matters, e.g. accessing a database or other back-ends
  • 12. Realistic Real World Benchmark • a lot of variables that have to be controlled • more complex, likely to surface weird bugs • face unanswerable questions • are expensive to do • are easy to attack, but hard to defend
  • 13. My Reasoning • “I can not compare everything out there against everything else. But I can compare what I want to use in the future against what I am using today.”
  • 14. Search Case Study • Right Panel retrieved using AJAX • { ‘html’: ‘<div>...</div>’, ‘css’: ‘...’, ‘js:’ ‘...’, ... }
  • 15. Refresh Right Panel 1. receive a request JSON API 2. call a JSON API over HTTP 2. 3. manipulate the data structure Node.js 3. 4. 4. render it as HTML using Mustache 1. 5. 5. write back wrapped in JSON Client
  • 16. Refresh Right Panel 1. receive a request JSON API 2. call a JSON API over HTTP 2. 3. manipulate the data structure xy 3. ro 4. Node.js P 4. render it as HTML using Mustache 1. 5. 5. write back wrapped in JSON Client
  • 17. Constraints • Network bandwidth and latency • Gigabit and 1ms • JSON API performance • load-balanced cluster with cache
  • 18. Implementations • Apache + PHP • Node.js (+ YUI) • Manhattan + Mojito
  • 19. Apache + PHP • works, in production for decades • initial response times are “good enough” • scales, but you need $$$ • baseline to get a feeling for the numbers
  • 20. Apache + PHP • 430req/s @ 60ms average latency • 99% @ 114ms
  • 21. Node.js (+ YUI) • works, but very new and untested stack • initial response times are very low • scales extremely well • YUI works well, but still has pitfalls
  • 22. Node.js Fun Facts • >3100 requests per second • 100k requests in 32s • 9MByte/s network traffic • serve >2k req/s at 20ms average latency • 99% @ 47ms
  • 25. Node.js Histogram ~1500req/s | 25 conc. 12000 99% @ 35ms 10000 8000 frequency 6000 4000 2000 0 11.000 - 17.300 - 23.600 - 29.900 - 36.200 - 42.500 - 48.800 - 55.100 - 61.400 - 67.700 - 74.000 - 17.300 23.600 29.900 36.200 42.500 48.800 55.100 61.400 67.700 74.000 80.300
  • 26. Node.js Histogram ~2900/s | 100 conc. 9000 8000 99% @ 79ms 7000 6000 frequency 5000 4000 3000 2000 1000 0 12.000 - 22.000 - 32.000 - 42.000 - 52.000 - 62.000 - 72.000 - 82.000 - 92.000 - 102.000 - 112.000 - 22.000 32.000 42.000 52.000 62.000 72.000 82.000 92.000 102.000 112.000 122.000
  • 27. Node.js Histogram ~3100/s | 200 conc. 8000 7000 99% @ 152ms 6000 5000 frequency 4000 3000 2000 1000 0 14.000 - 33.900 - 53.800 - 73.700 - 93.600 - 113.500 - 133.400 - 153.300 - 173.200 - 193.100 - 213.000 - 33.900 53.800 73.700 93.600 113.500 133.400 153.300 173.200 193.100 213.000 232.900
  • 28. Manhattan + Mojito • works, but extremely new and untested stack • initial response times are low (60% compared to Apache/PHP) • scales well (twice as good as Apache/PHP)
  • 31. Findings • Both node.js implementations scale linearly before CPU usage hits 100% • Node.js scales extremely well as proxy • Manhattan and Mojito can perform better than Apache and PHP (for this use case) • Node.js applications are very sensitive to memory leaks or complex/blocking code
  • 32. DNS in Node.js • getaddrinfo() sys call is synchronous • gethostbyname() is, too • ares_gethostbyname() is asynchronous • no cache • node 0.6 uses a getaddrinfo() thread pool, but still relies on ares for other calls
  • 34. Manhattan? • Yahoo!’s Node.js cloud • can run any node.js application • allows calls to HTTP APIs (e.g.YQL) • deployment of versioned apps • apps can specify their environment http://developer.yahoo.com/blogs/ydn/posts/2011/11/yahoo-announces-cocktails-%E2%80%93-shaken-not-stirred/
  • 35. Mojito? • Yahoo!‘s Node.js MVC framework • provides identical similar runtime for your code on the client and server • contains all server- and client-side code • built on top of YUI • will be open sourced http://developer.yahoo.com/blogs/ydn/posts/2011/11/yahoo-announces-cocktails-%E2%80%93-shaken-not-stirred/
  • 36. The Cocktails way Mojito Application Mojit Assets Model Client JS Images Controller View CSS ...
  • 37. Conclusion • Node.js can serve hundreds of concurrent requests quickly and reliable, “better” than Apache/PHP • It scales extremely well for I/O bound use cases • It tears down the client-server language barrier, opening new architectural possibilities
  • 38. Thank you! Picture: "Esther Müller" / www.jugendfotos.de, CC-License(by-nc)

Notes de l'éditeur

  1. \n
  2. \n
  3. JSON\n
  4. \n
  5. JSON\n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n