0.01
No commit activity in last 3 years
No release in over 3 years
There's a lot of open issues
Brokers requests for alephant components
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Project Readme

Alephant::Broker

Brokers requests for rendered templates, retrieved from S3 or a HTML endpoint.

Build StatusGem Version

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:

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:

https://github.com/BBC-News/Documentation/blob/master/Alephant/Diagrams/Alephant%20Revalidate%20Broker.png?raw=true

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

  1. Fork it!
  2. Create your feature branch: git checkout -b my-new-feature
  3. Commit your changes: git commit -am 'Add some feature'
  4. Push to the branch: git push origin my-new-feature
  5. Create a new Pull Request.

Feel free to create a new issue if you find a bug.