Giter VIP home page Giter VIP logo

artsy-eventservice's Introduction

Artsy EventService Build Status

Ruby Gem for producing events in Artsy's event stream.

Installation

Add following line to your Gemfile

gem 'artsy-eventservice'

Configuration

Add artsy_eventservice.rb within config/initializers. Artsy::EventService uses Bunny to connect to RabbitMQ. Here is a sample of configuration:

# config/initializers/artsy_eventservice.rb
Artsy::EventService.configure do |config|
  config.app_name = 'my-app'  # Used for RabbitMQ queue name
  config.event_stream_enabled = true  # Boolean used to enable/disable posting events
  config.rabbitmq_url = 'amqp(s)://<user>:<pass>@<host>:<port>/<vhost>'  # required
  config.tls = true  # following configs are only used if tls is true
  config.tls_ca_certificate = <string content>
  config.tls_cert = <string content>
  config.tls_key = <string content>
  config.verify_peer = true  # Boolean used to decide in case we are using tls, we should verify peer or not
end

Usage

Create events by inheriting from Events::BaseEvent. Override the properties that are different than BaseEvent and set extra properties.

module Events
  class ConversationEvent < Events::BaseEvent
    def subject
      {
        id: @object.to_id,
        display: @object.to_name
      }
    end

    def properties
      {
        test_prop: 'testing'
      }
    end
  end
end

Enabling Posting Events

We have a feature flag setup for enabling/disabling EventService. Setting EVENT_STREAM_ENABLED env variable will enable posting events. Not having this env means event service is disabled and no events will actually be sent.

Posting events

Call post_event with proper topic and event:

Artsy::EventService.post_event(topic: 'testing', event: event_model)

How to pick topic and routing key?

Think of topic as high level business area. From consumer perspective there will be one connection per topic, consumer can decide to filter events they want to receive in that topic based on routing_key they listening on. For topic use plural names.

We recommend to use following routing_key strategy: <model_name>.<verb>.

Few examples:

  • Topic: conversations, routing key: message.sent
  • Topic: conversations, routing key: conversation.created
  • Topic: conversations, routing key: conversation.dismissed
  • Topic: invoices, routing key: invoice.paid
  • Topic: invoices, routing key: merchantaccount.created

BaseEvent provides routing_key method by default which follows the same pattern mention above, you can override routing_key when calling post_event. In the default routing key we use to_s.downcase.gsub('::', '-') on class name of the @object so an instance of Artsy::UserRequest with action being test will lead to artsy-userrequest.test.

Update to Version 1.0

In previous versions this gem was using Environment variables for configuration. On version 1.0, configuration step is now mandatory and it will no longer read environment variables directly. Make sure to go to configuration step.

Update to Version 1.0.3

Since this version we've updated routing_key to default to <event object class name>.<event.verb>. This means if your consumers were listening on verb routing key, now they need to update to include object's class name. You can always override this feature by passing in routing_key to post_event.

Contributing

  • Fork the project.
  • Make your feature addition or bug fix with tests.
  • Update CHANGELOG.
  • Send a pull request. Bonus points for topic branches.

artsy-eventservice's People

Contributors

ashkan18 avatar dependabot[bot] avatar dleve123 avatar erikdstock avatar izakp avatar joeyaghion avatar jonallured avatar saolsen avatar starsirius avatar sweir27 avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.