Más contenido relacionado La actualidad más candente (20) Similar a AP4R on Developers Summit 2008 (20) AP4R on Developers Summit 200816. AP4R ?
• Ruby
• Asynchronous Processing for Ruby
•
16 19. “RtFA”
http://www.future.co.jp/company/news/061227.html
19 22. From Java
to Ruby
22 http://www.oreilly.co.jp/books/9784873113203/ 36. Client Server Messaging Server
33 37. Client Server Messaging Servers
34 43. AP4R
•
• API
• Rails
• All in one support
•
•
40 61. • AP4R ×2
• Rails × 4 / AP4R
•1
• MySQL
58 63. •
•
TextMe for Business
( http://textmeforbusiness.com )
• 2007 7
60 65. on SMS
AP4R queues
acceptance
inbound Text
processing
delivery outbound delivery
delivery
processing
Third Party
routing application
62 75. > “AP4R”.sub(/4/, ”A”)
> “APAR”.downcase
> “apar”
>
Dictionary http://www.alc.co.jp/
Photo http://www.flickr.com/photos/jeffclow/29738818/
72 86. Class AsyncShopController < ApplicationController
def order # synchronous part
o = Order.new(:name => params[:name])
o.save!
ap4r.async_to({:action => ‘payment’},
{:order_id => o.id})
redirect_to ...
end
def payment # asynchronous part
Payment.new(:order_id => params[:order_id]).save!
...
render :text => ‘true’
end
end
83 87. User Apache Rails AP4R
84 88. User Apache Rails AP4R
order
message put
85 89. Class AsyncShopController < ApplicationController
def order # synchronous part
o = Order.new(:name => params[:name])
o.save!
ap4r.async_to({:action => ‘payment’},
{:order_id => o.id})
redirect_to ...
end
def payment # asynchronous part
Payment.new(:order_id => params[:order_id]).save!
...
render :text => ‘true’
end
end
86 90. User Apache Rails AP4R
order
message put
87 91. User Apache Rails AP4R
dispatch
88 92. User Apache Rails AP4R
payment
89 93. Class AsyncShopController < ApplicationController
def order # synchronous part
o = Order.new(:name => params[:name])
o.save!
ap4r.async_to({:action => ‘payment’},
{:order_id => o.id})
redirect_to ...
end
def payment # asynchronous part
Payment.new(:order_id => params[:order_id]).save!
...
render :text => ‘true’
end
end
90 96. User Apache Rails AP4R
93 98. User Apache Rails AP4R
95 100. User Apache Rails AP4R
URL rewrite
97 101. User Apache Rails AP4R
URL rewrite
HTTP
97 102. User Apache Rails AP4R
URL rewrite
HTTP
98 103. • : HTTP POST
• :
• SOAP
• XML-RPC
• dRuby
99 107. dispatchers:
-
targets: queue.very_busy.*
threads: 10
modify_rules:
url: proc {|url| url.host = quot;busy.async.hostquot;}
-
targets: queue.very_heavy.*
threads: 1
modify_rules:
url: proc {|url| url.host = quot;heavy.async.hostquot;}
103 111. Client Server
A B
order payment
107 113. Client Rails AP4R Rails × 3
A
order
109 114. Client Rails AP4R Rails × 3
A B
order payment
110 115. Client Rails AP4R Rails × 3
100
75
50
25
0
111 124. Rails app-DB AP4R msg-DB
CRUD Store
SAF create
commit
Forward
message put
insert /commit
SAF delete
✓
120 128. Rails app-DB AP4R
start
end
124 129. Rails app-DB AP4R
start
CRUD
end
124 130. Rails app-DB AP4R
start
CRUD
commit
end
124 131. Rails app-DB AP4R
start
CRUD
commit
message put / commit
end
124 132. Rails app-DB AP4R
start
CRUD
commit
message put / commit
end
data
124 133. Rails app-DB AP4R
start
CRUD
commit
message put / commit
end
data messages
124 139. Ap4r::Client#transaction
Class ShopController < ApplicationController
def order # synchronous side
ap4r.transaction do
o = Order.new(:name => params[:order_id])
o.save!
ap4r.async_to({:action => ‘payment’},
{:order_id => o.id})
end
redirect_to ...
end
end
130 148. start
CRUD
commit
message put / commit
end
data messages
134 149. start
CRUD
commit
message put / commit
end
data messages
134 150. start
CRUD
commit
message put / commit
end
data messages
135 151. start
CRUD
commit
message put / commit
end
data messages
135 152. start
CRUD
commit
message put / commit
end
data messages
135 153. start
CRUD
commit
message put / commit
end
data messages
136 154. start
CRUD
commit
message put / commit
end
data messages
136 155. start
CRUD
commit
message put / commit
end
data messages
136 156. start
CRUD
commit
counterchange
message put / commit
end
data messages
137 157. start
CRUD
message put / commit
counterchange
commit
end
data messages
138 158. start
CRUD
message put / commit
commit
end
data messages
139 159. start
CRUD
message put / commit
commit
end
data messages
139 160. start
CRUD
message put / commit
commit
end
data messages
140 161. start
CRUD
message put / commit
commit
end
data messages
140 162. start
CRUD
message put / commit
commit
end
data messages
140 163. start
CRUD
message put / commit
commit
end
data messages
141 164. start
CRUD
message put / commit
commit
end
data messages
141 165. start
CRUD
message put / commit
commit
end
data messages
141 169. start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
145 170. start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
146 171. start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
146 172. start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
147 173. start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
147 174. start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
147 175. start CRUD
SAF create
commit
message put / commit
SAF update
end
data ☺ messages
147 176. start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
147 177. start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
148 178. start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
148 179. start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
149 180. start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
149 181. start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
149 182. start CRUD
SAF create
commit
message put / commit
SAF update
end
data ☺ messages
149 183. start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
150 184. start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
150 185. start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
151 186. start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
151 187. start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
messages
151 188. start CRUD
SAF create
commit
message put / commit
Recoverable
SAF update
end
data messages
messages
151 189. start CRUD
SAF create
commit
message put / commit
Recoverable
SAF update
end
data
messages ☺ messages
151 190. start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
152 191. start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
152 192. start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
153 193. start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
messages
153 194. start CRUD
SAF create
commit
message put / commit
SAF update
end
data
messages ☺ messages
153 195. start CRUD
SAF create
commit
message put / commit
SAF update Duplicated
end
data
messages ☺ messages
153 201. 2
• Functional
•
•
• Async
•
•
159 207. 2
• Functional
•
•
• Async
•
•
165 210. def test_order
post :order, :order => {:item => quot;introduction to AP4Rquot;}
assert_response :redirect
assert_redirected_to :action => 'index'
messages = @controller.ap4r.queued_messages # ... (1)
assert_equal 1, messages.keys.size, quot;should have messages in just ONE queuequot;
assert messages.key?(quot;queue.async_shop.paymentquot;), quot;queue name is INCORRECTquot;
# ... (2)
assert_equal 1, messages[quot;queue.async_shop.paymentquot;].size,
quot;should have just ONE message for paymentquot;
assert_match /order_id=d+/, messages[quot;queue.async_shop.paymentquot;].first[:body],
quot;parameter order_id should be included with a numeric valuequot; # ... (3)
end
1.
2. assert
3. assert
168 214. [RAILS_ROOT]/test/async/ap4r_test_helper.rb
ENV[quot;RAILS_ENVquot;] = quot;testquot;
require File.expand_path(File.dirname(__FILE__) + quot;/../../config/environmentquot;)
require quot;ap4r/service_handlerquot;
ap4r_test_helper = Ap4r::ServiceHandler.new
require 'test_help'
class Test::Unit::TestCase
self.use_transactional_fixtures = false
self.use_instantiated_fixtures = false
# Add more helper methods to be used by all tests here...
cattr_accessor :ap4r_helper
def ap4r_helper
@@ap4r_helper
end
def with_services(&block)
ap4r_helper.with_services(&block)
end
end
Test::Unit::TestCase.ap4r_helper = ap4r_test_helper
172 215. [RAILS_ROOT]/test/async/async_shop_test.rb
require quot;#{File.dirname(__FILE__)}/ap4r_test_helperquot;
require 'net/http'
class AsyncShopTest < Test::Unit::TestCase
def test_http_dispatch
ap4r_helper.stop_dispatchers # ... (1)
assert_rows_added(Order, 1) { # ... (3)
do_order # ... (2)
}
assert_rows_added(Payment, 1) { # ... (6)
ap4r_helper.start_dispatchers # ... (4)
ap4r_helper.wait_all_done # ... (5)
}
end
private
# Requests to <tt>async_shop/order</tt>.
def do_order(item_name = quot;test itemquot;)
Net::HTTP.start(quot;localhostquot;, 3000, nil, nil) do |http|
http.request_post(quot;/async_shop/orderquot;,
quot;order[item]=#{item_name}quot;) do |res|
#nop
end
end
end
def assert_rows_added(model, rows)
rows_before = model.count
yield
rows_after = model.count
assert_equal rows, rows_after - rows_before, quot;table '#{model.table_name}' should count up by #{rows}quot;
end
end
173 218. • 2
• Functional
• Async
•
176 231. • Future Architect logo belongs to Future Architect, Inc.
Japan. All rights reserved.
• Rails logo is trademarks of David Heinemeier
Hansson. All rights reserved.
• The Ruby logo is copyrighted (c) 2006, Yukihiro
Matsumoto. It is released under the terms of the
Creative Commons Attribution-ShareAlike 2.5 License.
189