SlideShare une entreprise Scribd logo
1  sur  42
Télécharger pour lire hors ligne
The case file of
Mobage Open Platform	
  Mobage
                    	
 Toru Yamaguchi <zigorou@cpan.org>
   http://d.hatena.ne.jp/ZIGOROu/
             DeNA co.,ltd.
              2011/10/14
            YAPC Asia 2011
! 
     ! 
     ! 

! 


     ! 
!   Wikipedia
     ! 



! 
     ! 

     !          (Cause Analysis)
     !          (Failure Prevention)
     !          (Knowledge Distribution)
(   )
1 DeadLock                                     	

!         API (T                 )                           Dead Lock

     !                   API
                                     Internal Server Error

     ! 


! 
     !   Internal Server Error
(1)	
!                   API   GET

     !    totalResults             OpenSearch

!             totalResults
     SQL_CALC_FOUND_ROWS
     !                           SELECT

! 
     totalResults
     !   INSERT, DELETE         TRIGGER
(2)	
!                    SHOW INNODB STATUS
     !   Dead Lock
     ! 


! 
     !                UPDATE

          !                                 UPDATE

     ! 
BEGIN;

SELECT id FROM somedata_group WHERE name = ?;

INSERT INTO somedata(id, group_id, data, published_on)
VALUES(?, ?, ?, ?);

UPDATE somedata_summary SET total_results = total_results
+ 1, updated_on = ? WHERE group_id = ?;

COMMIT;
(3)	
!   Group
     ! 
     ! 


! 
     ! 
                                    UPDATE
               increment
     !                                  MySQL
          Dead Lock
(4)	

        Transaction	
   group_id = 1	
           Transaction	




                        group_id = 2	


                        group_id = 3	
           Transaction	
group_id = 3
UPDATE
                        group_id = 4	


                        group_id = 5	
           Transaction
(1)	
! 
     !            UPDATE                          w
     !                       SELECT               totalResults

     !   INSERT                 incr/decr        QUEUE
                         UPDATE
     !                totalResults

     !                      xaicron
(2)	
/* API                */

BEGIN;

INSERT INTO somedata(id, group_id, data, published_on)
VALUES(?, ?, ?, ?);

INSERT INTO somedata_summary_queue(id, group_id,
affected_number, published_on);

COMMIT;
(3)	
/* Batch Worker       */

BEGIN;

SELECT id, group_id, affected_number FROM
somegroup_summary_queue ORDER BY published_on ASC LIMIT 100;

/* group                               UPDATE */

UPDATE somedata_summary SET total_results = ?, updated_on = ?
WHERE group_id = ?;

…

DELETE somegroup_summary_queue WHERE id IN (?, ?, …, ?);

COMMIT;
(1)	
! 
     ! 

     ! 

     !         InnoDB    QUEUE
                 (      ) UPDATE


          ! 
(2)	
! 
     !    InnoDB            QUEUE              INDEX

          !   INSERT, DELETE         enqueue

     !                      queue
          WHERE        id
          ! 
               FOR UPDATE
     ! 
2 INSERT vs DELETE	

! 
     ! 

!          API (             T            )
     !          1            INSERT
     !        API
          purge
     !                            purge       (   )
                    INSERT

! 
     !       shard
(   )
(1)	
!              purge
     !           MASTER      DELETE                 SLAVE            ww
          !   DELETE
          !                          redo             SLAVE

     !                       sleep          wait                 DB
                                                      wait

          !                          wait

!                      wait
     !   SLAVE          Seconds_Behind_Master                 wait
     !                               wait
Loop::Sustainable (1)	
! 
! https://github.com/zigorou/p5-loop-sustainable
! 
     ! 
     ! 
     ! 
                   wait
          ! 
          !               Seconds_Behind_Master

     !                      b ry
Loop::Sustainable (2)	
         process	
                 process	
                                               2sec	
         process	
                                   process	

         process	
                             2sec	

                                   process	
         process	
                                               2sec	

         process	
                 process	

                                               2sec	

Seconds_Behind_Master : 10 sec	
   process	

                                               2sec
(2)	
!                               w

!   SET SESSION sql_log_bin = 0

     !   MASTER      SLAVE             DELETE


!             DELETE

     !                                          prefork
                       DELETE
                  xaicron                   (        )
(3)	
! 

!   DELETE

!   DELETE                    purge
     !    partitioning    API

!   STOP SLAVE       DB
    Master

     ! 
     ! 
(1)	
!                   DELETE
     !                                DELETE
     !   DELETE              SELECT

!                 MySQL
     ! 
          ! 
          !    RDBMS
     ! 

!   SET SESSION sql_log_bin=0
     !                           DELETE
(2)	
!              DELETE                       INSERT

     !               Partitioning

     !           Sharding


! 
     !    mysqldump –w      WHERE
(1)	
! 
     ! 

     ! 
     !   PRIMARY KEY

     ! 
     !                 ALTER TABLE some_table ADD
          KEY
     ! 
     !     M
(2)	
! 
     ! 
     !              DML

          !    incr/decr
     ! 

          ! 
3                    	
! 
! 
! 

     API    Push   friend timeline

     !                               DB


!                             API
(1)	
! 
     ! 
     ! 
     ! 

!                                       count,
     startIndex (LIMIT/OFFSET      )

! 
SELECT friend_user_id FROM friends WHERE user_id = ?;
/*                       */
SELECT user_id FROM user_app WHERE app_id = ? AND
user_id IN (?, ?, …, ?);

/*                        */
SELECT SQL_CALC_FOUND_ROWS user_id, nickname
FROM users WHERE user_id IN(?, ?, …, ?) LIMIT 50
OFFSET 0;

SELECT FOUND_ROWS();
LIMIT 50
                                 valid users    OFFSET 0	
                                  500 users	
               installed users
                 750 users	
  friend
1000 users
(2)	
!   friends       n:m, user_app     1:n, users        1:1
!   friends                                                 (    1000
              )         user_app



!   users               SQL_CALC_FOUND_ROWS
                           LIMIT, OFFSET

!                         friends

     !            Temporary Table                     INSERT    users
          JOIN
(1)	
! 
     ! selectall_arrayref
     ! 

!   SQL_CALC_FOUND_ROWS
     !   LIMIT, OFFSET                         COUNT(*)

     ! 

!   Temporary Table
     ! 
     ! 
     !       user_id         user_id
             LIMIT, OFFSET
(2)	
!   prepare, fetchall_arrayref($max_rows)
     !   DBI::st   fetchall_arrayref($max_rows)       $max_rows

     ! 
     !                 friends           1000

!               1000             users                 user_app

     !   1000

!                                             1000
     users
     !             1000

! 
installed users                          valid users
  friend                         installed users         750 users	
                 750 users	
1000 users	
                       1000 users	

               installed users                          valid users
                 750 users	
                             750 users	
  friend                         installed users
1000 users	
                       1000 users	
         100 users	
               installed users
                 750 users	
     installed users
                                   250 users	
  friend
1000 users	



    end
 iteration
(3)	
! 


! 

!   Iterator::GroupedRange
     !   http://search.cpan.org/dist/Iterator-GroupedRange/

!                              List::MoreUtils   natatime
              I::GR       (fetchall_arrayref($max_rows)
          )
(4)	
! 

!   friends             DB                      1000
    memcached        get/set

!    user_app           mapping                memcached
         ( install                                  )

!                      iteration    DB
          DB                       iteration    set

!                                       3

     !                                                 xaicron
(1)	
! 

     ! 


! 
     ! 
          w

!             kazuho
! 
     ! 
     ! 
     ! 

! 
     ! 
          xaicron
     ! 


! 

     ! 

Contenu connexe

Similaire à Mobage Open Platform case file

"Mobage DBA Fight against Big Data" - NHN TE
"Mobage DBA Fight against Big Data" - NHN TE"Mobage DBA Fight against Big Data" - NHN TE
"Mobage DBA Fight against Big Data" - NHN TERyosuke IWANAGA
 
20th.陈晓鸣 百度海量日志分析架构及处理经验分享
20th.陈晓鸣 百度海量日志分析架构及处理经验分享20th.陈晓鸣 百度海量日志分析架构及处理经验分享
20th.陈晓鸣 百度海量日志分析架构及处理经验分享elevenma
 
Big Data @ Orange - Dev Day 2013 - part 2
Big Data @ Orange - Dev Day 2013 - part 2Big Data @ Orange - Dev Day 2013 - part 2
Big Data @ Orange - Dev Day 2013 - part 2ovarene
 
Javascript engine performance
Javascript engine performanceJavascript engine performance
Javascript engine performanceDuoyi Wu
 
Virtual machine and javascript engine
Virtual machine and javascript engineVirtual machine and javascript engine
Virtual machine and javascript engineDuoyi Wu
 
Introduction aux Macros
Introduction aux MacrosIntroduction aux Macros
Introduction aux Macrosunivalence
 
Origins of Elixir programming language
Origins of Elixir programming languageOrigins of Elixir programming language
Origins of Elixir programming languagePivorak MeetUp
 
[Ruxcon 2011] Post Memory Corruption Memory Analysis
[Ruxcon 2011] Post Memory Corruption Memory Analysis[Ruxcon 2011] Post Memory Corruption Memory Analysis
[Ruxcon 2011] Post Memory Corruption Memory AnalysisMoabi.com
 
การเขียนโปรแกรมด้วยภาษา C
การเขียนโปรแกรมด้วยภาษา Cการเขียนโปรแกรมด้วยภาษา C
การเขียนโปรแกรมด้วยภาษา CC Omputer R Oom
 
การเขียนโปรแกรมด้วยภาษา C
การเขียนโปรแกรมด้วยภาษา Cการเขียนโปรแกรมด้วยภาษา C
การเขียนโปรแกรมด้วยภาษา CC Omputer R Oom
 
การเขียนโปรแกรมด้วยภาษา C
การเขียนโปรแกรมด้วยภาษา Cการเขียนโปรแกรมด้วยภาษา C
การเขียนโปรแกรมด้วยภาษา CC Omputer R Oom
 
การเขียนโปรแกรมด้วยภาษา C
การเขียนโปรแกรมด้วยภาษา Cการเขียนโปรแกรมด้วยภาษา C
การเขียนโปรแกรมด้วยภาษา CC Omputer R Oom
 
Introduction to Linux Exploit Development
Introduction to Linux Exploit DevelopmentIntroduction to Linux Exploit Development
Introduction to Linux Exploit Developmentjohndegruyter
 
MongoDB: Replication,Sharding,MapReduce
MongoDB: Replication,Sharding,MapReduceMongoDB: Replication,Sharding,MapReduce
MongoDB: Replication,Sharding,MapReduceTakahiro Inoue
 
Madrid Spark Big Data Bluemix Meetup - Spark Versus Hadoop @ 100 TB Daytona G...
Madrid Spark Big Data Bluemix Meetup - Spark Versus Hadoop @ 100 TB Daytona G...Madrid Spark Big Data Bluemix Meetup - Spark Versus Hadoop @ 100 TB Daytona G...
Madrid Spark Big Data Bluemix Meetup - Spark Versus Hadoop @ 100 TB Daytona G...Chris Fregly
 
Introduction to Spark
Introduction to SparkIntroduction to Spark
Introduction to SparkLi Ming Tsai
 
[CCC-28c3] Post Memory Corruption Memory Analysis
[CCC-28c3] Post Memory Corruption Memory Analysis[CCC-28c3] Post Memory Corruption Memory Analysis
[CCC-28c3] Post Memory Corruption Memory AnalysisMoabi.com
 
เฉลยคำตอบ O
เฉลยคำตอบ Oเฉลยคำตอบ O
เฉลยคำตอบ OSurapong Jakang
 
参考書選びと迷った時の勉強法。 #antama_ws
参考書選びと迷った時の勉強法。 #antama_ws参考書選びと迷った時の勉強法。 #antama_ws
参考書選びと迷った時の勉強法。 #antama_wsTakahiro Yoshimura
 

Similaire à Mobage Open Platform case file (20)

"Mobage DBA Fight against Big Data" - NHN TE
"Mobage DBA Fight against Big Data" - NHN TE"Mobage DBA Fight against Big Data" - NHN TE
"Mobage DBA Fight against Big Data" - NHN TE
 
20th.陈晓鸣 百度海量日志分析架构及处理经验分享
20th.陈晓鸣 百度海量日志分析架构及处理经验分享20th.陈晓鸣 百度海量日志分析架构及处理经验分享
20th.陈晓鸣 百度海量日志分析架构及处理经验分享
 
Big Data @ Orange - Dev Day 2013 - part 2
Big Data @ Orange - Dev Day 2013 - part 2Big Data @ Orange - Dev Day 2013 - part 2
Big Data @ Orange - Dev Day 2013 - part 2
 
Javascript engine performance
Javascript engine performanceJavascript engine performance
Javascript engine performance
 
Virtual machine and javascript engine
Virtual machine and javascript engineVirtual machine and javascript engine
Virtual machine and javascript engine
 
Introduction aux Macros
Introduction aux MacrosIntroduction aux Macros
Introduction aux Macros
 
Hadoop I/O Analysis
Hadoop I/O AnalysisHadoop I/O Analysis
Hadoop I/O Analysis
 
Origins of Elixir programming language
Origins of Elixir programming languageOrigins of Elixir programming language
Origins of Elixir programming language
 
[Ruxcon 2011] Post Memory Corruption Memory Analysis
[Ruxcon 2011] Post Memory Corruption Memory Analysis[Ruxcon 2011] Post Memory Corruption Memory Analysis
[Ruxcon 2011] Post Memory Corruption Memory Analysis
 
การเขียนโปรแกรมด้วยภาษา C
การเขียนโปรแกรมด้วยภาษา Cการเขียนโปรแกรมด้วยภาษา C
การเขียนโปรแกรมด้วยภาษา C
 
การเขียนโปรแกรมด้วยภาษา C
การเขียนโปรแกรมด้วยภาษา Cการเขียนโปรแกรมด้วยภาษา C
การเขียนโปรแกรมด้วยภาษา C
 
การเขียนโปรแกรมด้วยภาษา C
การเขียนโปรแกรมด้วยภาษา Cการเขียนโปรแกรมด้วยภาษา C
การเขียนโปรแกรมด้วยภาษา C
 
การเขียนโปรแกรมด้วยภาษา C
การเขียนโปรแกรมด้วยภาษา Cการเขียนโปรแกรมด้วยภาษา C
การเขียนโปรแกรมด้วยภาษา C
 
Introduction to Linux Exploit Development
Introduction to Linux Exploit DevelopmentIntroduction to Linux Exploit Development
Introduction to Linux Exploit Development
 
MongoDB: Replication,Sharding,MapReduce
MongoDB: Replication,Sharding,MapReduceMongoDB: Replication,Sharding,MapReduce
MongoDB: Replication,Sharding,MapReduce
 
Madrid Spark Big Data Bluemix Meetup - Spark Versus Hadoop @ 100 TB Daytona G...
Madrid Spark Big Data Bluemix Meetup - Spark Versus Hadoop @ 100 TB Daytona G...Madrid Spark Big Data Bluemix Meetup - Spark Versus Hadoop @ 100 TB Daytona G...
Madrid Spark Big Data Bluemix Meetup - Spark Versus Hadoop @ 100 TB Daytona G...
 
Introduction to Spark
Introduction to SparkIntroduction to Spark
Introduction to Spark
 
[CCC-28c3] Post Memory Corruption Memory Analysis
[CCC-28c3] Post Memory Corruption Memory Analysis[CCC-28c3] Post Memory Corruption Memory Analysis
[CCC-28c3] Post Memory Corruption Memory Analysis
 
เฉลยคำตอบ O
เฉลยคำตอบ Oเฉลยคำตอบ O
เฉลยคำตอบ O
 
参考書選びと迷った時の勉強法。 #antama_ws
参考書選びと迷った時の勉強法。 #antama_ws参考書選びと迷った時の勉強法。 #antama_ws
参考書選びと迷った時の勉強法。 #antama_ws
 

Plus de Toru Yamaguchi

これからの Microservices
これからの Microservicesこれからの Microservices
これからの MicroservicesToru Yamaguchi
 
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015Toru Yamaguchi
 
Mobage Connect と Identity 関連技術への取り組み - OpenID Summit Tokyo 2015
Mobage Connect と Identity 関連技術への取り組み - OpenID Summit Tokyo 2015Mobage Connect と Identity 関連技術への取り組み - OpenID Summit Tokyo 2015
Mobage Connect と Identity 関連技術への取り組み - OpenID Summit Tokyo 2015Toru Yamaguchi
 
革新的ブラウザゲームを支えるプラットフォーム技術
革新的ブラウザゲームを支えるプラットフォーム技術革新的ブラウザゲームを支えるプラットフォーム技術
革新的ブラウザゲームを支えるプラットフォーム技術Toru Yamaguchi
 
技術選択とアーキテクトの役割 (要約版)
技術選択とアーキテクトの役割 (要約版)技術選択とアーキテクトの役割 (要約版)
技術選択とアーキテクトの役割 (要約版)Toru Yamaguchi
 
技術選択とアーキテクトの役割
技術選択とアーキテクトの役割技術選択とアーキテクトの役割
技術選択とアーキテクトの役割Toru Yamaguchi
 
How to bake delicious cookie (RESTful Meetup #03)
How to bake delicious cookie (RESTful Meetup #03)How to bake delicious cookie (RESTful Meetup #03)
How to bake delicious cookie (RESTful Meetup #03)Toru Yamaguchi
 
JSON Based Web Services
JSON Based Web ServicesJSON Based Web Services
JSON Based Web ServicesToru Yamaguchi
 
ngCore engine for mobage platform
ngCore engine for mobage platformngCore engine for mobage platform
ngCore engine for mobage platformToru Yamaguchi
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platformToru Yamaguchi
 
mbga Open Platform and Perl
mbga Open Platform and Perlmbga Open Platform and Perl
mbga Open Platform and PerlToru Yamaguchi
 
Inside mbga Open Platform API architecture
Inside mbga Open Platform API architectureInside mbga Open Platform API architecture
Inside mbga Open Platform API architectureToru Yamaguchi
 
Introduction OpenID Authentication 2.0 Revival
Introduction OpenID Authentication 2.0 RevivalIntroduction OpenID Authentication 2.0 Revival
Introduction OpenID Authentication 2.0 RevivalToru Yamaguchi
 
Introduction OpenID Authentication 2.0
Introduction OpenID Authentication 2.0Introduction OpenID Authentication 2.0
Introduction OpenID Authentication 2.0Toru Yamaguchi
 
The Security of OpenID Authentication 2.0
The Security of OpenID Authentication 2.0The Security of OpenID Authentication 2.0
The Security of OpenID Authentication 2.0Toru Yamaguchi
 
Customization of DBIC::Schema::Loader
Customization of DBIC::Schema::LoaderCustomization of DBIC::Schema::Loader
Customization of DBIC::Schema::LoaderToru Yamaguchi
 

Plus de Toru Yamaguchi (20)

これからの Microservices
これからの Microservicesこれからの Microservices
これからの Microservices
 
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
 
Mobage Connect と Identity 関連技術への取り組み - OpenID Summit Tokyo 2015
Mobage Connect と Identity 関連技術への取り組み - OpenID Summit Tokyo 2015Mobage Connect と Identity 関連技術への取り組み - OpenID Summit Tokyo 2015
Mobage Connect と Identity 関連技術への取り組み - OpenID Summit Tokyo 2015
 
革新的ブラウザゲームを支えるプラットフォーム技術
革新的ブラウザゲームを支えるプラットフォーム技術革新的ブラウザゲームを支えるプラットフォーム技術
革新的ブラウザゲームを支えるプラットフォーム技術
 
技術選択とアーキテクトの役割 (要約版)
技術選択とアーキテクトの役割 (要約版)技術選択とアーキテクトの役割 (要約版)
技術選択とアーキテクトの役割 (要約版)
 
技術選択とアーキテクトの役割
技術選択とアーキテクトの役割技術選択とアーキテクトの役割
技術選択とアーキテクトの役割
 
How to bake delicious cookie (RESTful Meetup #03)
How to bake delicious cookie (RESTful Meetup #03)How to bake delicious cookie (RESTful Meetup #03)
How to bake delicious cookie (RESTful Meetup #03)
 
JSON Based Web Services
JSON Based Web ServicesJSON Based Web Services
JSON Based Web Services
 
ngCore engine for mobage platform
ngCore engine for mobage platformngCore engine for mobage platform
ngCore engine for mobage platform
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platform
 
mbga Open Platform and Perl
mbga Open Platform and Perlmbga Open Platform and Perl
mbga Open Platform and Perl
 
Inside mbga Open Platform API architecture
Inside mbga Open Platform API architectureInside mbga Open Platform API architecture
Inside mbga Open Platform API architecture
 
Introduction OpenID Authentication 2.0 Revival
Introduction OpenID Authentication 2.0 RevivalIntroduction OpenID Authentication 2.0 Revival
Introduction OpenID Authentication 2.0 Revival
 
OpenID Mobile Profile
OpenID Mobile ProfileOpenID Mobile Profile
OpenID Mobile Profile
 
Introduction OpenID Authentication 2.0
Introduction OpenID Authentication 2.0Introduction OpenID Authentication 2.0
Introduction OpenID Authentication 2.0
 
OpenID 2009
OpenID 2009OpenID 2009
OpenID 2009
 
Mobile Openid
Mobile OpenidMobile Openid
Mobile Openid
 
Client Side Cache
Client Side CacheClient Side Cache
Client Side Cache
 
The Security of OpenID Authentication 2.0
The Security of OpenID Authentication 2.0The Security of OpenID Authentication 2.0
The Security of OpenID Authentication 2.0
 
Customization of DBIC::Schema::Loader
Customization of DBIC::Schema::LoaderCustomization of DBIC::Schema::Loader
Customization of DBIC::Schema::Loader
 

Dernier

TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionDilum Bandara
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfRankYa
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 

Dernier (20)

TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An Introduction
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdf
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 

Mobage Open Platform case file

  • 1. The case file of Mobage Open Platform Mobage Toru Yamaguchi <zigorou@cpan.org> http://d.hatena.ne.jp/ZIGOROu/ DeNA co.,ltd. 2011/10/14 YAPC Asia 2011
  • 2. !  !  !  !  ! 
  • 3. !   Wikipedia !  !  !  !  (Cause Analysis) !  (Failure Prevention) !  (Knowledge Distribution)
  • 4. ( )
  • 5. 1 DeadLock !  API (T ) Dead Lock !  API Internal Server Error !  !  !   Internal Server Error
  • 6. (1) !  API GET ! totalResults OpenSearch !  totalResults SQL_CALC_FOUND_ROWS !  SELECT !  totalResults !   INSERT, DELETE TRIGGER
  • 7. (2) !  SHOW INNODB STATUS !   Dead Lock !  !  !  UPDATE !  UPDATE ! 
  • 8. BEGIN; SELECT id FROM somedata_group WHERE name = ?; INSERT INTO somedata(id, group_id, data, published_on) VALUES(?, ?, ?, ?); UPDATE somedata_summary SET total_results = total_results + 1, updated_on = ? WHERE group_id = ?; COMMIT;
  • 9. (3) !   Group !  !  !  !  UPDATE increment !  MySQL Dead Lock
  • 10. (4) Transaction group_id = 1 Transaction group_id = 2 group_id = 3 Transaction group_id = 3 UPDATE group_id = 4 group_id = 5 Transaction
  • 11. (1) !  !  UPDATE w !  SELECT totalResults !   INSERT incr/decr QUEUE UPDATE !  totalResults !  xaicron
  • 12. (2) /* API */ BEGIN; INSERT INTO somedata(id, group_id, data, published_on) VALUES(?, ?, ?, ?); INSERT INTO somedata_summary_queue(id, group_id, affected_number, published_on); COMMIT;
  • 13. (3) /* Batch Worker */ BEGIN; SELECT id, group_id, affected_number FROM somegroup_summary_queue ORDER BY published_on ASC LIMIT 100; /* group UPDATE */ UPDATE somedata_summary SET total_results = ?, updated_on = ? WHERE group_id = ?; … DELETE somegroup_summary_queue WHERE id IN (?, ?, …, ?); COMMIT;
  • 14. (1) !  !  !  !  InnoDB QUEUE ( ) UPDATE ! 
  • 15. (2) !  ! InnoDB QUEUE INDEX !   INSERT, DELETE enqueue !  queue WHERE id !  FOR UPDATE ! 
  • 16.
  • 17. 2 INSERT vs DELETE !  !  !  API ( T ) !  1 INSERT !  API purge !  purge ( ) INSERT !  !  shard
  • 18. ( )
  • 19.
  • 20. (1) !  purge !  MASTER DELETE SLAVE ww !   DELETE !  redo SLAVE !  sleep wait DB wait !  wait !  wait !   SLAVE Seconds_Behind_Master wait !  wait
  • 21. Loop::Sustainable (1) !  ! https://github.com/zigorou/p5-loop-sustainable !  !  !  !  wait !  !  Seconds_Behind_Master !  b ry
  • 22. Loop::Sustainable (2) process process 2sec process process process 2sec process process 2sec process process 2sec Seconds_Behind_Master : 10 sec process 2sec
  • 23. (2) !  w !   SET SESSION sql_log_bin = 0 !   MASTER SLAVE DELETE !  DELETE !  prefork DELETE xaicron ( )
  • 24. (3) !  !   DELETE !   DELETE purge !  partitioning API !   STOP SLAVE DB Master !  ! 
  • 25. (1) !  DELETE !  DELETE !   DELETE SELECT !  MySQL !  !  !  RDBMS !  !   SET SESSION sql_log_bin=0 !  DELETE
  • 26. (2) !  DELETE INSERT !  Partitioning !  Sharding !  ! mysqldump –w WHERE
  • 27. (1) !  !  !  !   PRIMARY KEY !  !  ALTER TABLE some_table ADD KEY !  !  M
  • 28. (2) !  !  !  DML !  incr/decr !  ! 
  • 29.
  • 30. 3 !  !  !  API Push friend timeline !  DB !  API
  • 31. (1) !  !  !  !  !  count, startIndex (LIMIT/OFFSET ) ! 
  • 32. SELECT friend_user_id FROM friends WHERE user_id = ?; /* */ SELECT user_id FROM user_app WHERE app_id = ? AND user_id IN (?, ?, …, ?); /* */ SELECT SQL_CALC_FOUND_ROWS user_id, nickname FROM users WHERE user_id IN(?, ?, …, ?) LIMIT 50 OFFSET 0; SELECT FOUND_ROWS();
  • 33. LIMIT 50 valid users OFFSET 0 500 users installed users 750 users friend 1000 users
  • 34. (2) !   friends n:m, user_app 1:n, users 1:1 !   friends ( 1000 ) user_app !   users SQL_CALC_FOUND_ROWS LIMIT, OFFSET !  friends !  Temporary Table INSERT users JOIN
  • 35. (1) !  ! selectall_arrayref !  !   SQL_CALC_FOUND_ROWS !   LIMIT, OFFSET COUNT(*) !  !   Temporary Table !  !  !  user_id user_id LIMIT, OFFSET
  • 36. (2) !   prepare, fetchall_arrayref($max_rows) !   DBI::st fetchall_arrayref($max_rows) $max_rows !  !  friends 1000 !  1000 users user_app !   1000 !  1000 users !  1000 ! 
  • 37. installed users valid users friend installed users 750 users 750 users 1000 users 1000 users installed users valid users 750 users 750 users friend installed users 1000 users 1000 users 100 users installed users 750 users installed users 250 users friend 1000 users end iteration
  • 38. (3) !  !  !   Iterator::GroupedRange ! http://search.cpan.org/dist/Iterator-GroupedRange/ !  List::MoreUtils natatime I::GR (fetchall_arrayref($max_rows) )
  • 39. (4) !  !   friends DB 1000 memcached get/set ! user_app mapping memcached ( install ) !  iteration DB DB iteration set !  3 !  xaicron
  • 40. (1) !  !  !  !  w !  kazuho
  • 41.
  • 42. !  !  !  !  !  !  xaicron !  !  !