Skip to content

Instantly share code, notes, and snippets.

Architectural Proposal: Hybrid Messaging Strategy for AppX

Executive Summary

As we build AppX—our new service for managing reference data such as movies, TV shows, and people (actors, directors, writers)—we have an opportunity to evaluate our inter-service communication patterns and consider an approach that better serves this use case.

This proposal recommends that AppX expose a query API alongside event publication, adopting a hybrid messaging strategy that combines the strengths of push-based events with on-demand data access. This approach aligns with industry-standard patterns for reference data services and addresses several operational challenges we've observed in our current architecture.

The recommendation is not to abandon our event-driven architecture, but to evolve it. Events remain valuable for notifications and real-time updates. However, for reference data that many services need to query across multiple dimensions, a complementary API provides significant operational and reliabili

defmodule MyAppWeb.Schema.NonNullNotation do
defmacro field!(identifier, type) do
quote do
field(unquote(identifier), non_null(unquote(type)))
end
end
defmacro field!(identifier, type, attrs) do
quote do
field(unquote(identifier), non_null(unquote(type)), unquote(attrs))

Keybase proof

I hereby claim:

  • I am austinthecoder on github.
  • I am austinthecoder (https://keybase.io/austinthecoder) on keybase.
  • I have a public key ASA8xOYuuEp1G7cyemGryaywl8X-eERK6o2UdD6-hkoeMwo

To claim this, I am signing this object:

@austinthecoder
austinthecoder / hyper.js
Created April 25, 2017 16:42
hyper config
// Future versions of Hyper may add additional config options,
// which will not automatically be merged into this file.
// See https://hyper.is#cfg for all currently supported options.
module.exports = {
config: {
// default font size in pixels for all tabs
fontSize: 12,
// font family with optional fallbacks
def self.to_google_params(params)
given_name = params[:first_name] if params.key? :first_name
family_name = params[:last_name] if params.key? :last_name
department = params[:department] if params.key? :department
title = params[:title] if params.key? :title
result = {}
result[:primaryEmail] = params[:address] if params.key? :address
result[:password] = params[:password] if params.key? :password
result[:name] = {givenName: given_name, familyName: family_name} if given_name || family_name
#!/usr/bin/env ruby
require 'csv'
file_path = ARGV[0]
CSV.readlines(file_path).each do |row|
next if row[0] == 'Factor'
table = {

Hotfix

  1. fetch all remotes: git fetch --all
  2. create hotfix branch from prod: git git checkout -b hotfix remotes/us/master
  3. commit
  4. release: rh deploy
  5. merge to master: git checkout master, git merge hotfix
  6. delete hotfix: git branch -d hotfix

Workflow

if needs approval
  if requires immediate release
    - work on <feature> (branched from master)
    when approved
      - rebase master to <feature>, merge <feature> to master
      - merge master to develop
 else
# IN AMAZON EC2 SERVER #
########################
sudo su
apt-get -y update && apt-get -y upgrade
apt-get install vim git-core curl openssh-server openssh-client python-software-properties build-essential zlib1g-dev libssl-dev libreadline-gplv2-dev libcurl4-openssl-dev aptitude
/usr/sbin/groupadd wheel
/usr/sbin/visudo
(paste bottom)
%wheel ALL=(ALL) ALL
class Parser
def errors
@errors ||= []
end
end
describe Parser do
describe '#errors' do
it "is an empty list" do
subject.errors.should == []