Alephant::Broker
Brokers requests for rendered templates, retrieved from S3 or a HTML endpoint.
Installation
Add this line to your application's Gemfile:
gem 'alephant-broker'
And then execute:
bundle install
Or install it yourself as:
gem install alephant-broker
Usage
The Broker is capable of retrieving rendered templates from either S3 or a HTML endpoint (e.g. alephant-publisher-request). This must be decided when creating an instance of the Broker, as a load strategy is given as a parameter (see below for examples).
Barebones
S3 Load Strategy
require 'alephant/broker'
config = {
:s3_bucket_id => 'test_bucket',
:s3_object_path => 'foo',
:lookup_table_name => 'test_lookup'
}
request = {
'PATH_INFO' => '/component/foo',
'QUERY_STRING' => 'variant=bar',
'REQUEST_METHOD' => 'GET'
}
Alephant::Broker::Application.new(
Alephant::Broker::LoadStrategy::S3.new,
config
).call(request).tap do |response|
puts "status: #{response.status}"
puts "content: #{response.content}"
end
HTML Load Strategy
require 'alephant/broker'
class UrlGenerator < Alephant::Broker::LoadStrategy::HTTP::URL
def generate(id, options)
"http://example-api.com/data?id=#{id}"
end
end
request = {
'PATH_INFO' => '/component/foo',
'QUERY_STRING' => 'variant=bar',
'REQUEST_METHOD' => 'GET'
}
Alephant::Broker::Application.new(
Alephant::Broker::LoadStrategy::HTTP.new(UrlGenerator.new),
{}
).call(request).tap do |response|
puts "status: #{response.status}"
puts "content: #{response.content}"
end
Note
The HTML load strategy relies upon being given a URLGenerator, which is used to generate the URL of the HTML endpoint (see below for example). The class must:
- be implemented within your own application.
- extend
Alephant::Broker::LoadStrategy::HTTP::URL
. - include a
#generate
method which takesid
(string) andoptions
(hash) as parameters.
require 'alephant/broker'
require 'rack'
class UrlGenerator < Alephant::Broker::LoadStrategy::HTTP::URL
def generate(id, options)
"http://api.my-app.com/component/#{id}?#{to_query_string(options)}"
end
private
def to_query_string(hash)
Rack::Utils.build_query hash
end
end
Revalidate Strategy
require 'alephant/broker'
config = {
:s3_bucket_id => 'test_bucket',
:s3_object_path => 'foo',
:lookup_table_name => 'test_lookup',
:sqs_queue_name => 'test_queue',
:elasticache_config_endpoint => 'test_elisticache'
:revalidate_cache_ttl => 30
}
Alephant::Broker::Application.new(
Alephant::Broker::LoadStrategy::Revalidate::Strategy.new,
config
).call(request).tap do |response|
puts "status: #{response.status}"
puts "content: #{response.content}"
end
The "Revalidate" strategy uses the following process flow:
And uses the following AWS resources:
- S3 - for storage of rendered components
- DynamoDB - for recording S3 component locations
- Elasticache - for caching S3 content and recording "inflight" messages
- SQS - for communication between the broker and renderer
Rack App
Create config.ru using example below, and then run:
rackup config.ru
require 'alephant/broker'
require 'alephant/broker/load_strategy/http'
class UrlGenerator < Alephant::Broker::LoadStrategy::HTTP::URL
def generate(id, options)
"http://example-api.com/data?id=#{id}"
end
end
run Alephant::Broker::Application.new(
Alephant::Broker::LoadStrategy::HTTP.new(UrlGenerator.new),
{}
)
Cache version number
The broker looks for a configuration value elasticache_cache_version
and if it exists it uses it to construct the cache key.
This allows the cache to be busted if the data in the cache changes, or for any other reason that it needs to be invalidated.
This version is added as a header to the response in the following format:
X-Cache-Version: {CACHE_VERSION}
Contributing
- Fork it!
- Create your feature branch:
git checkout -b my-new-feature
- Commit your changes:
git commit -am 'Add some feature'
- Push to the branch:
git push origin my-new-feature
- Create a new Pull Request.
Feel free to create a new issue if you find a bug.