Slideshare.net (beta)

 

All comments

Add a comment on Slide 1

If you have a SlideShare account, login to comment; else you can comment as a guest


Showing 1-50 of 3 (more)

AP4R on RubyKaigi2007 (English only)

From kiwamu, 1 year ago

Rubykaigi2007 presentation

1975 views  |  0 comments  |  3 favorites  |  37 downloads
Embed
options

More Info

CC Attribution License
This slideshow is Public
Total Views: 1975
on Slideshare: 1975
from embeds: 0

Slideshow transcript

Slide 1: RubyKaigi 2007 AP4R Kiwamu Kato & Shun’ichi Shinohara Future Architect, Inc. 1

Slide 2: • Introduction • Demo • Real world examples • Technical topics 2

Slide 3: Introduction 3

Slide 4: Self Introduction 4

Slide 5: Kiwamu Kato • Majored in Civil Engineering • Has Enhanced and maintained messaging middleware in company 5

Slide 6: Kiwamu Kato • Started Ruby since last year • Leader of the AP4R team • http://d.hatena.ne.jp/kiwamu/ 6

Slide 7: shino • Programmer, I love coding ! • The language of the year is C or Haskell 7

Slide 8: shino • Last year, made a debut to the OSS world • http://d.hatena.ne.jp/ita-wasa/ 8

Slide 9: What is AP4R ? 9

Slide 10: Lightweight Messaging 10

Slide 11: What is AP4R ? • Asynchronous Processing for Ruby • Loose coupling by messaging 11

Slide 12: What can we do w/ AP4R ? • Quicker response to users • Load distribution 12

Slide 13: Press release 2006/09/05 http://itpro.nikkeibp.co.jp/article/NEWS/20060905/247218/ 13

Slide 14: Key points are .. 14

Slide 15: Lightweight and Robust 15

Slide 16: When is it useful ? 16

Slide 17: Quicker response to users 17

Slide 18: If NO speedy response is needed, execute it later

Slide 19: Before Client Server A B C D ... 19

Slide 20: After Client Server Messaging Server A B 20

Slide 21: After Client Server Messaging Server A B C D ... 21

Slide 22: Useful cases • Logging • Sending mail • Creating heavy summary data • Collaboration with other systems 22

Slide 23: Moreover, load distribution 23

Slide 24: Easy to scale out Client Server Messaging Server 24

Slide 25: Easy to scale out Client Server Messaging Servers 25

Slide 26: Only good things ? 26

Slide 27: Sounds easy ? 27

Slide 28: (Maybe) No 28

Slide 29: If message deliveries are NOT guaranteed,... 29

Slide 30: it may lead to message lost and message duplication 30

Slide 31: In other words... 31

Slide 32: •You can’t receive the goods despite payment ! • Double withdrawals ! 32

Slide 33: Messages should be delivered in a reliable way, 33

Slide 34: No matter what happens • Database trouble • Network trouble • Server down • Busy and timeout • ... etc 34

Slide 35: Lightweight and Robust 35

Slide 36: In Future Architect ... 36

Slide 37: We use messaging a lot • Developed own messaging library • Named “RtFA” 37

Slide 38: We use messaging a lot • Pure Java • Its own protocol, API (≠ JMS) • Time-proven on various systems 38

Slide 39: One of illustrative cases Mission critical system in transportation business http://japan.internet.com/linuxtoday/20061228/5.html 39

Slide 40: PJ summary • Over 100 million package data per day • Load distribution and parallel processing on 8 nodes of Oracle 10g RAC 40

Slide 41: PJ summary • Approx 100 servers • Used “RtFA”, an in-house middleware 41

Slide 42: Messaging is important

Slide 43: 43

Slide 44: Lightweight Messaging 44

Slide 45: http://www.pragmaticprogrammer.com/titles/fr_j2r/ http://www.oreilly.co.jp/books/9784873113203/ 45

Slide 46: From RtFA to AP4R • Based on implementation/experiences with Java, kept good parts, improved bad parts • Focus on ease of use API, configuration 46

Slide 47: Lightweight and Robust 47

Slide 48: Demo 48

Slide 49: Outline • Shopping store application • Order and payment 49

Slide 50: Shopping store app. Client Rails Order . Payment 50

Slide 51: Loose coupling AP4R Client Rails Rails × 3 Order 51

Slide 52: Loose coupling AP4R Client Rails Rails × 3 Payment Order 52

Slide 53: Loose coupling AP4R Client Rails Rails × 3 Payment Order Sleep 1 53

Slide 54: Outline • Use mongrel cluster • Stress by ab • Monitor queue retaining status 54

Slide 55: Real world examples 55

Slide 56: Two examples • Work With Rails • Our internal project 56

Slide 57: Working With Rails http://workingwithrails.com/ 57

Slide 58: WWR • is who’s who for Rails developers • listed 7,000 people from 104 countries 58

Slide 59: 59

Slide 60: WWR • aggregates feeds from user’s blog • has scaling problem in fetching them slow/stale 60

Slide 61: WWR solution • Queue Feeds • Fetch async’ly \"Getting Distributed with Ruby on Rails\" slide #44 (from slideshare) 61

Slide 62: WWR solution • Able to scale • Flexible to feed types 62

Slide 63: Internal project 63

Slide 64: Briefing • Work sheet management app. newly-building in Ruby • Labor cost accounting app. existing in Java 64

Slide 65: Requirements • Quick and rich UI • Replicate data between Java and Ruby 65

Slide 66: With AP4R • Separate loads from UI • Invoke Java from Ruby async’ly 66

Slide 67: Separate loads from UI Client Server Messaging Server 67

Slide 68: Separate loads from UI Client Server Messaging Server 67

Slide 69: Separate loads from UI Client Server Messaging Server 67

Slide 70: Separate loads from UI Client Server Messaging Server Create summary data, Send mails, etc. 68

Slide 71: Async’ly invoke Java Client Server Messaging Server 69

Slide 72: Async’ly invoke Java Client Server Messaging Server 69

Slide 73: Async’ly invoke Java Client Server Messaging Server data replication, etc. 69

Slide 74: Async’ly invoke Java Client Server Messaging Server data replication, etc. 69

Slide 75: Utilize Async! when • Needless proc. for responce data • Disjoined transactions are allowable • External calls (often slow, unstable) 70

Slide 76: Technical topics 71

Slide 77: Two topics here • API to put messages and process flow • Stored and Forward 72

Slide 78: API to put messages and process flow 73

Slide 79: ap4r.async_to({specify next}, {request data} [,{more opts}]) There’s also block style c.f. RDoc: http://ap4r.rubyforge.org/doc/ 74

Slide 80: Class ShopController < ApplicationController def order # synchronous side ... ap4r.async_to({:action => ‘payment’}, {:id => 1}) redirect_to ... end def payment # asynchronous side id = params[:id] ... render :text => “true” end end 75

Slide 81: Process flow 76

Slide 82: User Apache Rails AP4R 77

Slide 83: User Apache Rails AP4R order message put 78

Slide 84: User Apache Rails AP4R dispatch 79

Slide 85: User Apache Rails AP4R payment 80

Slide 86: Able to separate sync/async servers 81

Slide 87: User Apache Rails AP4R 82

Slide 88: Architecture AP4R HTTP AP4R DRB druby DRB reliable-msg SOAP XML -RPC AP4R MySQL mongrel HTTP 83

Slide 89: Thanks to DRb 4% 10% reliable-msg 20% mongrel 66% rails

Slide 90: Stored And Forward 85

Slide 91: Stored ? Forward ? 86

Slide 92: at-least-once between Producer and Channel 87

Slide 93: Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions by Gregor Hohpe,Bobby Woolf Guaranteed Delivery [122] 88

Slide 94: Typical flow to create async. messages 89

Slide 95: start end 90

Slide 96: start CRUD end 90

Slide 97: start CRUD commit end 90

Slide 98: start CRUD commit message put / commit end 90

Slide 99: start CRUD commit message put / commit end data 90

Slide 100: start CRUD commit message put / commit end data messages 90

Slide 101: Ensure (some) Atomicness of updating database and message creation 91

Slide 102: On updating database • Error occurs, • Any following messages must NOT be queued 92

Slide 103: On updating database • Everything succeeded, • All following messages must be queued 93

Slide 104: ☺ Relief 94

Slide 105: Lightweight and Robust 95

Slide 106: Ap4r::Client#transaction Class ShopController < ApplicationController def order # synchronous side ap4r.transaction do ... # CRUD on database ap4r.async_to ... end redirect_to ... end end 96

Slide 107: Process flow changes in queueing sequence 97

Slide 108: Behind ap4r.transaction ap4r.transaction do ... # CRUD on database ap4r.async_to(...) end 98

Slide 109: Behind ap4r.transaction ap4r.transaction do ... # CRUD on database Insert into SAF table ap4r.async_to(...) end 98

Slide 110: Behind ap4r.transaction ap4r.transaction do ... # CRUD on database Insert into SAF table ap4r.async_to(...) end Commit database 98

Slide 111: Behind ap4r.transaction ap4r.transaction do ... # CRUD on database Insert into SAF table ap4r.async_to(...) end Commit database Queue messages 98

Slide 112: Behind ap4r.transaction ap4r.transaction do ... # CRUD on database Insert into SAF table ap4r.async_to(...) Store end Commit database Queue messages 98

Slide 113: Behind ap4r.transaction ap4r.transaction do ... # CRUD on database Insert into SAF table ap4r.async_to(...) Store end Commit database Queue messages Forward 98

Slide 114: Sequence in detail Without SAF 99

Slide 115: start CRUD commit message put / commit end data messages 100

Slide 116: start CRUD commit message put / commit end data messages 100

Slide 117: start CRUD commit message put / commit end data messages 101

Slide 118: start CRUD commit message put / commit end data messages 101

Slide 119: start CRUD commit message put / commit ☠ end data messages 101

Slide 120: start CRUD commit message put / commit ☠ end data messages 101

Slide 121: start CRUD commit message put / commit ☠ end data messages 101

Slide 122: start CRUD commit counterchange message put / commit end data messages 102

Slide 123: start CRUD message put / commit counterchange commit end data messages 103

Slide 124: start CRUD message put / commit commit end data messages 104

Slide 125: start CRUD message put / commit commit end data messages 104

Slide 126: start CRUD message put / commit commit end data messages 105

Slide 127: start CRUD message put / commit commit end data messages 105

Slide 128: start CRUD message put / commit commit ☠ end data messages 105

Slide 129: start CRUD message put / commit commit ☠ end data messages 105

Slide 130: start CRUD message put / commit commit ☠ end data messages 105

Slide 131: Better Safe than Sorry • Database trouble • Network trouble • Server down • busy and timeout • ... etc 106

Slide 132: ☺ Embrace every exceptions ☠ 107

Slide 133: Sequence in detail With SAF 108

Slide 134: CRUD start SAF create commit message put / commit SAF update end data messages 109

Slide 135: CRUD start SAF create commit message put / commit SAF update end data messages 110

Slide 136: CRUD start SAF create commit message put / commit SAF update end data messages 110

Slide 137: CRUD start SAF create commit message put / commit SAF update end data messages 111

Slide 138: CRUD start SAF create commit message put / commit SAF update end data messages 111

Slide 139: CRUD start SAF create commit message put / commit SAF update end data messages 111

Slide 140: CRUD start SAF create commit message put / commit SAF update ☺ end data messages 111

Slide 141: CRUD start SAF create commit message put / commit SAF update ☺ end data messages 111

Slide 142: CRUD start SAF create commit message put / commit SAF update ☺ end data messages 111

Slide 143: CRUD start SAF create commit message put / commit SAF update end data messages 112

Slide 144: CRUD start SAF create commit message put / commit SAF update end data messages 112

Slide 145: CRUD start SAF create commit message put / commit SAF update end data messages 113

Slide 146: CRUD start SAF create commit message put / commit SAF update end data messages 113

Slide 147: CRUD start SAF create commit message put / commit SAF update end data messages messages 113

Slide 148: CRUD start SAF create commit message put / commit SAF update ☺ end data messages messages 113

Slide 149: CRUD start SAF create commit message put / commit Recoverable SAF update ☺ end data messages messages 113

Slide 150: CRUD start SAF create commit message put / commit SAF update ☺ end data messages messages 113

Slide 151: CRUD start SAF create commit message put / commit SAF update ☺ end data messages messages 113

Slide 152: CRUD start SAF create commit message put / commit SAF update end data messages 114

Slide 153: CRUD start SAF create commit message put / commit SAF update end data messages 114

Slide 154: CRUD start SAF create commit message put / commit SAF update end data messages 115

Slide 155: CRUD start SAF create commit message put / commit SAF update end data messages messages 115

Slide 156: CRUD start SAF create commit message put / commit SAF update ☺ end data messages messages 115

Slide 157: CRUD start SAF create commit message put / commit Duplicated SAF update ☺ end data messages messages 115

Slide 158: CRUD start SAF create commit message put / commit SAF update ☺ end data messages messages 115

Slide 159: CRUD start SAF create commit message put / commit SAF update ☺ end data messages messages 115

Slide 160: Ensure (some) Atomicness of data and messages 116

Slide 161: at-least-once between Producer and Channel 117

Slide 162: Summary 118

Slide 163: • Messaging with simple API, simple configuration. • Seamless collaboration with Rails 119

Slide 164: • Automatic invocation of async proc. • Guaranteed delivery by SAF 120

Slide 165: Lightweight and Robust 121

Slide 166: Future Plans 122

Slide 167: Smooth operation ver.0.3.x ☑ Daemonize ☑ URL-rewrite filter □ DLQ / SAF recovery □ Protocols: Stomp, HTTP 123

Slide 168: Monitoring ver.0.4.x □ Coordinate with Cacti, Nagios, etc. □ Many AP4R processes □ Interactive management tool 124

Slide 169: Step to large scale ver.0.5.x □ Dynamic configuration □ Automatic recovery □ Long running 125

Slide 170: Others □ Security □ Application testing support □ Blocking queues 126

Slide 171: AP4R@RubyForge • wiki: http://ap4r.rubyforge.org/wiki/wiki.pl?HomePage • source: svn co svn://rubyforge.org/var/svn/ap4r Your patches are welcome! Thank you. 127

Slide 172: • Future Architect logo belong to Future Architect, Inc. Japan. All rights reserved. • Rails logo are trademarks of David Heinemeier Hansson. All rights reserved. • The Ruby logo is copyright c 2006, Yukihiro Matsumoto. It is released under the terms of the Creative Commons Attribution-ShareAlike 2.5 License. 128