ap4r on rubykaigi2007 (english only)

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

Upload: kato-kiwamu

Post on 24-May-2015

2.777 views

Category:

Technology


1 download

DESCRIPTION

Rubykaigi2007 presentation

TRANSCRIPT

Page 1: AP4R on RubyKaigi2007 (English only)

AP4RKiwamu Kato & Shun’ichi Shinohara

Future Architect, Inc.

1

RubyKaigi 2007

Page 2: AP4R on RubyKaigi2007 (English only)

•Introduction 

•Demo 

•Real world examples 

•Technical topics 

2

Page 3: AP4R on RubyKaigi2007 (English only)

Introduction

3

Page 4: AP4R on RubyKaigi2007 (English only)

Self Introduction

4

Page 5: AP4R on RubyKaigi2007 (English only)

•Majored in Civil Engineering

•Has Enhanced and maintained messaging middleware in company

Kiwamu Kato

5

Page 6: AP4R on RubyKaigi2007 (English only)

•Started Ruby since last year

•Leader of the AP4R team

•http://d.hatena.ne.jp/kiwamu/

6

Kiwamu Kato

Page 7: AP4R on RubyKaigi2007 (English only)

shino•Programmer, I love coding !

•The language of the year is C or Haskell

7

Page 8: AP4R on RubyKaigi2007 (English only)

•Last year, made a debut to the OSS world

•http://d.hatena.ne.jp/ita-wasa/

8

shino

Page 9: AP4R on RubyKaigi2007 (English only)

What is AP4R ?

9

Page 10: AP4R on RubyKaigi2007 (English only)

Lightweight

Messaging

10

Page 11: AP4R on RubyKaigi2007 (English only)

What is AP4R ?

•Asynchronous Processing for Ruby

•Loose coupling by messaging

11

Page 12: AP4R on RubyKaigi2007 (English only)

What can we do w/ AP4R ?

•Quicker response to users

•Load distribution

12

Page 13: AP4R on RubyKaigi2007 (English only)

Press release 2006/09/05

13

http://itpro.nikkeibp.co.jp/article/NEWS/20060905/247218/

Page 14: AP4R on RubyKaigi2007 (English only)

Key points are ..

14

Page 15: AP4R on RubyKaigi2007 (English only)

Lightweight and

Robust

15

Page 16: AP4R on RubyKaigi2007 (English only)

When is it useful ?

16

Page 17: AP4R on RubyKaigi2007 (English only)

Quicker response to users

17

Page 18: AP4R on RubyKaigi2007 (English only)

If NO speedy response is needed,

execute it later

Page 19: AP4R on RubyKaigi2007 (English only)

Before

Client Server

19

A B C D ...

Page 20: AP4R on RubyKaigi2007 (English only)

Client Server Messaging Server

20

After

A B

Page 21: AP4R on RubyKaigi2007 (English only)

Client Server Messaging Server

21

After

A B C D ...

Page 22: AP4R on RubyKaigi2007 (English only)

Useful cases

•Logging

•Sending mail

•Creating heavy summary data

•Collaboration with other systems

22

Page 23: AP4R on RubyKaigi2007 (English only)

Moreover,load distribution

23

Page 24: AP4R on RubyKaigi2007 (English only)

Easy to scale out

Client Server Messaging Server

24

Page 25: AP4R on RubyKaigi2007 (English only)

Easy to scale out

Client Server Messaging Servers

25

Page 26: AP4R on RubyKaigi2007 (English only)

Only good things ?

26

Page 27: AP4R on RubyKaigi2007 (English only)

Sounds easy ?

27

Page 28: AP4R on RubyKaigi2007 (English only)

(Maybe) No

28

Page 29: AP4R on RubyKaigi2007 (English only)

If message deliveriesare NOT guaranteed,...

29

Page 30: AP4R on RubyKaigi2007 (English only)

message lost and

message duplication

it may lead to

30

Page 31: AP4R on RubyKaigi2007 (English only)

In other words...

31

Page 32: AP4R on RubyKaigi2007 (English only)

•You can’t receive the goods despite payment !

•Double withdrawals !

32

Page 33: AP4R on RubyKaigi2007 (English only)

Messages should be delivered in a reliable way,

33

Page 34: AP4R on RubyKaigi2007 (English only)

No matter what happens

34

•Database trouble

•Network trouble

•Server down

•Busy and timeout

• ... etc

Page 35: AP4R on RubyKaigi2007 (English only)

Lightweight and

Robust35

Page 36: AP4R on RubyKaigi2007 (English only)

In Future Architect ...

36

Page 37: AP4R on RubyKaigi2007 (English only)

•Developed own messaging library

•Named “RtFA”

We use messaging a lot

37

Page 38: AP4R on RubyKaigi2007 (English only)

•Pure Java

• Its own protocol, API (≠ JMS)

•Time-proven on various systems

38

We use messaging a lot

Page 39: AP4R on RubyKaigi2007 (English only)

One of illustrative cases

http://japan.internet.com/linuxtoday/20061228/5.html

Mission critical system in transportation business

39

Page 40: AP4R on RubyKaigi2007 (English only)

• Over 100 million package data per day

• Load distribution and parallel processing on 8 nodes of Oracle 10g RAC

PJ summary

40

Page 41: AP4R on RubyKaigi2007 (English only)

•Approx 100 servers

•Used “RtFA”, an in-house middleware

PJ summary

41

Page 42: AP4R on RubyKaigi2007 (English only)

Messaging is important

Page 43: AP4R on RubyKaigi2007 (English only)

43

Page 44: AP4R on RubyKaigi2007 (English only)

Lightweight

Messaging44

Page 46: AP4R on RubyKaigi2007 (English only)

From RtFA to AP4R

• Based on implementation/experiences with Java,kept good parts, improved bad parts

• Focus on ease of use(API, configuration)

46

Page 47: AP4R on RubyKaigi2007 (English only)

Lightweight and

Robust

47

Page 48: AP4R on RubyKaigi2007 (English only)

Demo

48

Page 49: AP4R on RubyKaigi2007 (English only)

•Shopping store application

•Order and payment

49

Outline

Page 50: AP4R on RubyKaigi2007 (English only)

Shopping store app.

Client Rails

50

.

Payment

Order

Page 51: AP4R on RubyKaigi2007 (English only)

Loose couplingClient Rails AP4R Rails × 3

51

Order

Page 52: AP4R on RubyKaigi2007 (English only)

Loose couplingClient Rails AP4R Rails × 3

52

Order Payment

Page 53: AP4R on RubyKaigi2007 (English only)

Loose couplingClient Rails AP4R Rails × 3

53

Order PaymentSleep 1

Page 54: AP4R on RubyKaigi2007 (English only)

•Use mongrel cluster

•Stress by ab

•Monitor queue retaining status

54

Outline

Page 55: AP4R on RubyKaigi2007 (English only)

Real world examples

55

Page 56: AP4R on RubyKaigi2007 (English only)

Two examples

•Work With Rails

•Our internal project

56

Page 57: AP4R on RubyKaigi2007 (English only)

Working With Rails

http://workingwithrails.com/

57

Page 58: AP4R on RubyKaigi2007 (English only)

WWR

•is who’s who for Rails developers

• listed 7,000 people from 104 countries

58

Page 59: AP4R on RubyKaigi2007 (English only)

59

Page 60: AP4R on RubyKaigi2007 (English only)

WWR

•aggregates feeds from user’s blog

•has scaling problem in fetching them slow/stale

60

Page 62: AP4R on RubyKaigi2007 (English only)

WWR solution

•Able to scale

•Flexible to feed types

62

Page 63: AP4R on RubyKaigi2007 (English only)

Internal project

63

Page 64: AP4R on RubyKaigi2007 (English only)

•Work sheet management app.newly-building in Ruby

Briefing

64

•Labor cost accounting app.existing in Java

Page 65: AP4R on RubyKaigi2007 (English only)

Requirements

•Quick and rich UI

•Replicate data between Java and Ruby

65

Page 66: AP4R on RubyKaigi2007 (English only)

With AP4R

•Separate loads from UI

• Invoke Java from Ruby async’ly

66

Page 67: AP4R on RubyKaigi2007 (English only)

Separate loads from UIClient Server Messaging Server

67

Page 68: AP4R on RubyKaigi2007 (English only)

Separate loads from UIClient Server Messaging Server

67

Page 69: AP4R on RubyKaigi2007 (English only)

Separate loads from UIClient Server Messaging Server

67

Page 70: AP4R on RubyKaigi2007 (English only)

Separate loads from UI

Create summary data, Send mails, etc.

68

Client Server Messaging Server

Page 71: AP4R on RubyKaigi2007 (English only)

Async’ly invoke Java

69

Client Server Messaging Server

Page 72: AP4R on RubyKaigi2007 (English only)

Async’ly invoke Java

69

Client Server Messaging Server

Page 73: AP4R on RubyKaigi2007 (English only)

Async’ly invoke Java

data replication, etc.

69

Client Server Messaging Server

Page 74: AP4R on RubyKaigi2007 (English only)

Async’ly invoke Java

data replication, etc.

69

Client Server Messaging Server

Page 75: AP4R on RubyKaigi2007 (English only)

Utilize Async! when

• Needless proc. for responce data

• Disjoined transactions are allowable

• External calls (often slow, unstable)

70

Page 76: AP4R on RubyKaigi2007 (English only)

Technical topics

71

Page 77: AP4R on RubyKaigi2007 (English only)

Two topics here

•API to put messages and process flow

•Stored and Forward

72

Page 78: AP4R on RubyKaigi2007 (English only)

API to put messagesand process flow

73

Page 79: AP4R on RubyKaigi2007 (English only)

ap4r.async_to({specify next}, {request data} [,{more opts}])

There’s also block stylec.f. RDoc: http://ap4r.rubyforge.org/doc/

74

Page 80: AP4R on RubyKaigi2007 (English only)

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

end75

Page 81: AP4R on RubyKaigi2007 (English only)

Process flow

76

Page 82: AP4R on RubyKaigi2007 (English only)

User Apache Rails AP4R

77

Page 83: AP4R on RubyKaigi2007 (English only)

User Apache Rails AP4R

order

message put

78

Page 84: AP4R on RubyKaigi2007 (English only)

User Apache Rails AP4R

dispatch79

Page 85: AP4R on RubyKaigi2007 (English only)

User Apache Rails AP4R

payment

80

Page 86: AP4R on RubyKaigi2007 (English only)

Able to separatesync/async servers

81

Page 87: AP4R on RubyKaigi2007 (English only)

User Apache Rails AP4R

82

Page 88: AP4R on RubyKaigi2007 (English only)

Architecture

mongrel

reliable-msg

AP4R

XML-RPC

SOAP

HTTP

AP4R DRB

AP4R

HTTP

drubyDRB

MySQL

83

Page 89: AP4R on RubyKaigi2007 (English only)

4%10%

20%

66%

DRbreliable-msgmongrelrails

Thanks to

Page 90: AP4R on RubyKaigi2007 (English only)

Stored And Forward

85

Page 91: AP4R on RubyKaigi2007 (English only)

Stored ?

Forward ?

86

Page 92: AP4R on RubyKaigi2007 (English only)

at-least-oncebetween Producer and Channel

87

Page 93: AP4R on RubyKaigi2007 (English only)

88

Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions by Gregor Hohpe,Bobby Woolf

Guaranteed Delivery [122]

Page 94: AP4R on RubyKaigi2007 (English only)

Typical flowto create async. messages

89

Page 95: AP4R on RubyKaigi2007 (English only)

start

end

90

Page 96: AP4R on RubyKaigi2007 (English only)

CRUDstart

end

90

Page 97: AP4R on RubyKaigi2007 (English only)

CRUD

commit

start

end

90

Page 98: AP4R on RubyKaigi2007 (English only)

CRUD

commit

message put / commit

start

end

90

Page 99: AP4R on RubyKaigi2007 (English only)

CRUD

commit

message put / commit

start

end

90

data

Page 100: AP4R on RubyKaigi2007 (English only)

CRUD

commit

message put / commit

start

end

90

data messages

Page 101: AP4R on RubyKaigi2007 (English only)

Ensure (some)

Atomicnessof

updating database andmessage creation

91

Page 102: AP4R on RubyKaigi2007 (English only)

•Error occurs,

•Any following messages must NOT be queued

92

On updating database

Page 103: AP4R on RubyKaigi2007 (English only)

•Everything succeeded,

•All following messages must be queued

93

On updating database

Page 104: AP4R on RubyKaigi2007 (English only)

Relief

94

Page 105: AP4R on RubyKaigi2007 (English only)

Lightweight and

Robust95

Page 106: AP4R on RubyKaigi2007 (English only)

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

Page 107: AP4R on RubyKaigi2007 (English only)

Process flow changesin queueing sequence

97

Page 108: AP4R on RubyKaigi2007 (English only)

ap4r.transaction do ... # CRUD on database

ap4r.async_to(...)

end

Behind ap4r.transaction

98

Page 109: AP4R on RubyKaigi2007 (English only)

ap4r.transaction do ... # CRUD on database

ap4r.async_to(...)

end

Behind ap4r.transaction

Insert into SAF table

98

Page 110: AP4R on RubyKaigi2007 (English only)

ap4r.transaction do ... # CRUD on database

ap4r.async_to(...)

end

Behind ap4r.transaction

Insert into SAF table

Commit database

98

Page 111: AP4R on RubyKaigi2007 (English only)

ap4r.transaction do ... # CRUD on database

ap4r.async_to(...)

end

Behind ap4r.transaction

Insert into SAF table

Commit databaseQueue messages

98

Page 112: AP4R on RubyKaigi2007 (English only)

ap4r.transaction do ... # CRUD on database

ap4r.async_to(...)

end

Behind ap4r.transaction

Insert into SAF table

Commit databaseQueue messages

Store

98

Page 113: AP4R on RubyKaigi2007 (English only)

ap4r.transaction do ... # CRUD on database

ap4r.async_to(...)

end

Behind ap4r.transaction

Insert into SAF table

Commit databaseQueue messages

Store

Forward

98

Page 114: AP4R on RubyKaigi2007 (English only)

Sequence in detailWithout SAF

99

Page 115: AP4R on RubyKaigi2007 (English only)

CRUD

commit

message put / commit

start

end

100

data messages

Page 116: AP4R on RubyKaigi2007 (English only)

CRUD

commit

message put / commit

start

end

100

data messages

Page 117: AP4R on RubyKaigi2007 (English only)

CRUD

commit

message put / commit

start

end

101

data messages

Page 118: AP4R on RubyKaigi2007 (English only)

CRUD

commit

message put / commit

start

end

101

data messages

Page 119: AP4R on RubyKaigi2007 (English only)

CRUD

commit

message put / commit

start

end

101

data messages☠

Page 120: AP4R on RubyKaigi2007 (English only)

CRUD

commit

message put / commit

start

end

101

data messages☠

Page 121: AP4R on RubyKaigi2007 (English only)

CRUD

commit

message put / commit

start

end

101

data messages☠

Page 122: AP4R on RubyKaigi2007 (English only)

CRUDstart

end

102

data messages

counterchangecommit

message put / commit

Page 123: AP4R on RubyKaigi2007 (English only)

CRUD

commit

message put / commit

start

end

103

data messages

counterchange

Page 124: AP4R on RubyKaigi2007 (English only)

CRUD

commit

message put / commit

start

end

104

data messages

Page 125: AP4R on RubyKaigi2007 (English only)

CRUD

commit

message put / commit

start

end

104

data messages

Page 126: AP4R on RubyKaigi2007 (English only)

CRUD

commit

message put / commit

start

end

105

data messages

Page 127: AP4R on RubyKaigi2007 (English only)

CRUD

commit

message put / commit

start

end

105

data messages

Page 128: AP4R on RubyKaigi2007 (English only)

CRUD

commit

message put / commit

start

end

105

data messages

Page 129: AP4R on RubyKaigi2007 (English only)

CRUD

commit

message put / commit

start

end

105

data messages

Page 130: AP4R on RubyKaigi2007 (English only)

CRUD

commit

message put / commit

start

end

105

data messages

Page 131: AP4R on RubyKaigi2007 (English only)

•Database trouble

•Network trouble

•Server down

•busy and timeout

• ... etc

Better Safe than Sorry

106

Page 132: AP4R on RubyKaigi2007 (English only)

Embrace every exceptions☺

107

Page 133: AP4R on RubyKaigi2007 (English only)

Sequence in detailWith SAF

108

Page 134: AP4R on RubyKaigi2007 (English only)

CRUD

commitmessage put / commit

start

end

109

data messages

SAF create

SAF update

Page 135: AP4R on RubyKaigi2007 (English only)

commitmessage put / commit

SAF update

CRUDstart

end

110

data messages

SAF create

Page 136: AP4R on RubyKaigi2007 (English only)

commitmessage put / commit

SAF update

CRUDstart

end

110

data messages

SAF create

Page 137: AP4R on RubyKaigi2007 (English only)

commitmessage put / commit

SAF update

CRUDstart

end

111

data messages

SAF create

Page 138: AP4R on RubyKaigi2007 (English only)

commitmessage put / commit

SAF update

CRUDstart

end

111

data messages

SAF create

Page 139: AP4R on RubyKaigi2007 (English only)

commitmessage put / commit

SAF update

CRUDstart

end

111

data messages

SAF create

Page 140: AP4R on RubyKaigi2007 (English only)

commitmessage put / commit

SAF update

CRUDstart

end

111

data messages

SAF create

Page 141: AP4R on RubyKaigi2007 (English only)

commitmessage put / commit

SAF update

CRUDstart

end

111

data messages

SAF create

Page 142: AP4R on RubyKaigi2007 (English only)

commitmessage put / commit

SAF update

CRUDstart

end

111

data messages

SAF create

Page 143: AP4R on RubyKaigi2007 (English only)

commitmessage put / commit

SAF update

CRUDstart

end

112

data messages

SAF create

Page 144: AP4R on RubyKaigi2007 (English only)

commitmessage put / commit

SAF update

CRUDstart

end

112

data messages

SAF create

Page 145: AP4R on RubyKaigi2007 (English only)

message put / commitcommit

SAF update

CRUDstart

end

113

data messages

SAF create

Page 146: AP4R on RubyKaigi2007 (English only)

message put / commitcommit

SAF update

CRUDstart

end

113

data messages

SAF create

Page 147: AP4R on RubyKaigi2007 (English only)

message put / commitcommit

SAF update

CRUDstart

end

113

data messages

SAF create

messages

Page 148: AP4R on RubyKaigi2007 (English only)

message put / commitcommit

SAF update

CRUDstart

end

113

data messages

SAF create

☺messages

Page 149: AP4R on RubyKaigi2007 (English only)

message put / commitcommit

SAF update

CRUDstart

end

113

data messages

SAF create

☺messages

Recoverable

Page 150: AP4R on RubyKaigi2007 (English only)

message put / commitcommit

SAF update

CRUDstart

end

113

data messages

SAF create

☺messages

Page 151: AP4R on RubyKaigi2007 (English only)

message put / commitcommit

SAF update

CRUDstart

end

113

data messages

SAF create

☺messages

Page 152: AP4R on RubyKaigi2007 (English only)

commitmessage put / commit

SAF update

CRUDstart

end

114

data messages

SAF create

Page 153: AP4R on RubyKaigi2007 (English only)

commitmessage put / commit

SAF update

CRUDstart

end

114

data messages

SAF create

Page 154: AP4R on RubyKaigi2007 (English only)

message put / commitcommit

SAF update

CRUDstart

end

115

data messages

SAF create

Page 155: AP4R on RubyKaigi2007 (English only)

message put / commitcommit

SAF update

CRUDstart

end

115

data messages

SAF create

messages

Page 156: AP4R on RubyKaigi2007 (English only)

message put / commitcommit

SAF update

CRUDstart

end

115

data messages

SAF create

☺messages

Page 157: AP4R on RubyKaigi2007 (English only)

message put / commitcommit

SAF update

CRUDstart

end

115

data messages

SAF create

☺messages

Duplicated

Page 158: AP4R on RubyKaigi2007 (English only)

message put / commitcommit

SAF update

CRUDstart

end

115

data messages

SAF create

☺messages

Page 159: AP4R on RubyKaigi2007 (English only)

message put / commitcommit

SAF update

CRUDstart

end

115

data messages

SAF create

☺messages

Page 160: AP4R on RubyKaigi2007 (English only)

Ensure (some)

Atomicnessof data and messages

116

Page 161: AP4R on RubyKaigi2007 (English only)

at-least-oncebetween Producer and Channel

117

Page 162: AP4R on RubyKaigi2007 (English only)

Summary

118

Page 163: AP4R on RubyKaigi2007 (English only)

•Messaging with simple API, simple configuration.

•Seamless collaboration with Rails

119

Page 164: AP4R on RubyKaigi2007 (English only)

•Automatic invocation of async proc.

•Guaranteed delivery by SAF

120

Page 165: AP4R on RubyKaigi2007 (English only)

Lightweight and

Robust

121

Page 166: AP4R on RubyKaigi2007 (English only)

Future Plans

122

Page 167: AP4R on RubyKaigi2007 (English only)

Smooth operation ver.0.3.x

☑ Daemonize

☑ URL-rewrite filter

□ DLQ / SAF recovery

□ Protocols: Stomp, HTTP

123

Page 168: AP4R on RubyKaigi2007 (English only)

Monitoring ver.0.4.x

□ Coordinate with Cacti, Nagios, etc.

□ Many AP4R processes

□ Interactive management tool

124

Page 169: AP4R on RubyKaigi2007 (English only)

Step to large scale ver.0.5.x

□ Dynamic configuration

□ Automatic recovery

□ Long running

125

Page 170: AP4R on RubyKaigi2007 (English only)

Others

□ Security

□ Application testing support

□ Blocking queues

126

Page 171: AP4R on RubyKaigi2007 (English only)

Your patches are welcome! Thank you.

127

AP4R@RubyForge

•wiki: http://ap4r.rubyforge.org/wiki/wiki.pl?HomePage

• source: svn co svn://rubyforge.org/var/svn/ap4r

Page 172: AP4R on RubyKaigi2007 (English only)

128

• 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.