Refactor Your Monolithic Rails App to a SOA

111
Refactoring Your Monolithic Rails App To A SOA: Risks and Rewards Saturday, March 19, 2011

description

 

Transcript of Refactor Your Monolithic Rails App to a SOA

Page 1: Refactor Your Monolithic Rails App to a SOA

Refactoring Your Monolithic Rails App

To A SOA:

Risks and Rewards

Saturday, March 19, 2011

Page 3: Refactor Your Monolithic Rails App to a SOA

The Birth Of A Monolithic Rails App:

A Simple Survey Engine

Saturday, March 19, 2011

Page 4: Refactor Your Monolithic Rails App to a SOA

Saturday, March 19, 2011

Page 5: Refactor Your Monolithic Rails App to a SOA

Saturday, March 19, 2011

Page 6: Refactor Your Monolithic Rails App to a SOA

Saturday, March 19, 2011

Page 7: Refactor Your Monolithic Rails App to a SOA

Saturday, March 19, 2011

Page 8: Refactor Your Monolithic Rails App to a SOA

Saturday, March 19, 2011

Page 9: Refactor Your Monolithic Rails App to a SOA

Saturday, March 19, 2011

Page 10: Refactor Your Monolithic Rails App to a SOA

Pretty Simple App, huh?

Saturday, March 19, 2011

Page 11: Refactor Your Monolithic Rails App to a SOA

“But we need to remarket all those emails.”

Saturday, March 19, 2011

Page 12: Refactor Your Monolithic Rails App to a SOA

Saturday, March 19, 2011

Page 13: Refactor Your Monolithic Rails App to a SOA

“We need more complex surveys.”

Saturday, March 19, 2011

Page 14: Refactor Your Monolithic Rails App to a SOA

Saturday, March 19, 2011

Page 15: Refactor Your Monolithic Rails App to a SOA

“Now we need an admin. And where’s our reporting?”

Saturday, March 19, 2011

Page 16: Refactor Your Monolithic Rails App to a SOA

Saturday, March 19, 2011

Page 17: Refactor Your Monolithic Rails App to a SOA

“Some clients need SOAP deliveries.”

Saturday, March 19, 2011

Page 18: Refactor Your Monolithic Rails App to a SOA

Saturday, March 19, 2011

Page 19: Refactor Your Monolithic Rails App to a SOA

And so on for 4 years.

Until...

Saturday, March 19, 2011

Page 20: Refactor Your Monolithic Rails App to a SOA

“What’s wrong with the site guys?”

Saturday, March 19, 2011

Page 21: Refactor Your Monolithic Rails App to a SOA

1. Slow

2. Buggy

3. New Features Take Forever To Implement

4. Deploys Are A Nightmare

5. Tons Of Dependencies

Saturday, March 19, 2011

Page 22: Refactor Your Monolithic Rails App to a SOA

We Needed To Go From This...

Saturday, March 19, 2011

Page 23: Refactor Your Monolithic Rails App to a SOA

DeliveryClient

BudgetCaps

BudgetSchool

Search

Lead

Referral

LeadProcessController

SearchResult

Campus

LeadStatus

CampusLocation

BudgetCaps

Contact

ContactDemographic

Program

DegreeLevel

StudyArea Company

Invitation

Enrollment

ReportsController

SchoolsController

BudgetsController

CampusLocationsController

ProgramsController

LeadsController

CompanyController

Monolithic RailsApp

Saturday, March 19, 2011

Page 24: Refactor Your Monolithic Rails App to a SOA

To This...

Saturday, March 19, 2011

Page 25: Refactor Your Monolithic Rails App to a SOA

LeadQualification

LeadDelivery

EmailRemarketing

RabbitMQ

LeadConversion

Reporting

BudgetService

AdminSurveyEngine

OperationalData Stores

Saturday, March 19, 2011

Page 26: Refactor Your Monolithic Rails App to a SOA

LeadQualification

LeadDelivery

EmailRemarketing

RabbitMQ

LeadConversion

Reporting

BudgetService

AdminSurveyEngine

OperationalData Stores

Saturday, March 19, 2011

Page 27: Refactor Your Monolithic Rails App to a SOA

LeadQualification

LeadDelivery

EmailRemarketing

RabbitMQ

LeadConversion

BudgetService

AdminSurveyEngine

OperationalData Stores

Reporting

Saturday, March 19, 2011

Page 28: Refactor Your Monolithic Rails App to a SOA

LeadQualification

LeadDelivery

EmailRemarketing

RabbitMQ

LeadConversion

Reporting

BudgetService

Admin

OperationalData Stores

SurveyEngine

Saturday, March 19, 2011

Page 29: Refactor Your Monolithic Rails App to a SOA

But How?

Saturday, March 19, 2011

Page 30: Refactor Your Monolithic Rails App to a SOA

Good Code

Bad Code

The Strangler Approach

Saturday, March 19, 2011

Page 31: Refactor Your Monolithic Rails App to a SOA

3 Drivers To Our ‘Strangler’ Approach:

1. Separate Responsibilities

2. Operate Asynchronously

3. Make Incremental Changes

Saturday, March 19, 2011

Page 32: Refactor Your Monolithic Rails App to a SOA

1. Separate Responsibilities

Saturday, March 19, 2011

Page 33: Refactor Your Monolithic Rails App to a SOA

Consolidate Like Functionality

Saturday, March 19, 2011

Page 34: Refactor Your Monolithic Rails App to a SOA

DeliveryClient

BudgetCaps

BudgetSchool

Search

Lead

Referral

LeadProcessController

SearchResult

Campus

LeadStatus

CampusLocation

BudgetCaps

Contact

ContactDemographic

Program

DegreeLevel

StudyArea Company

Invitation

Enrollment

ReportsController

SchoolsController

BudgetsController

CampusLocationsController

ProgramsController

LeadsController

CompanyController

Qualification Logic

Monolithic RailsApp

Saturday, March 19, 2011

Page 35: Refactor Your Monolithic Rails App to a SOA

DeliveryClient

BudgetCaps

BudgetSchool

Search

Lead

Referral

LeadProcessController

SearchResult

Campus

LeadStatus

CampusLocation

BudgetCaps

Contact

ContactDemographic

Program

DegreeLevel

StudyArea Company

Invitation

Enrollment

ReportsController

SchoolsController

BudgetsController

CampusLocationsController

ProgramsController

LeadsController

CompanyController

Monolithic RailsApp

Qualification Logic

Saturday, March 19, 2011

Page 36: Refactor Your Monolithic Rails App to a SOA

DeliveryClient

BudgetCaps

BudgetSchool

Search

Lead

Referral

LeadProcessController

SearchResult

Campus

LeadStatus

CampusLocation

BudgetCaps

Contact

ContactDemographic

Program

DegreeLevel

StudyArea Company

Invitation

Enrollment

ReportsController

SchoolsController

BudgetsController

CampusLocationsController

ProgramsController

LeadsController

CompanyController

Monolithic RailsApp

Qualification Logic

Saturday, March 19, 2011

Page 37: Refactor Your Monolithic Rails App to a SOA

DeliveryClient

BudgetCaps

BudgetSchool

Search

Lead

Referral

LeadProcessController

SearchResult

Campus

LeadStatus

CampusLocation

BudgetCaps

Contact

ContactDemographic

Program

DegreeLevel

StudyArea Company

Invitation

Enrollment

ReportsController

SchoolsController

BudgetsController

CampusLocationsController

ProgramsController

LeadsController

CompanyController

Qualification Logic

Monolithic RailsApp

Saturday, March 19, 2011

Page 38: Refactor Your Monolithic Rails App to a SOA

DeliveryClient

BudgetCaps

BudgetSchool

Search

Lead

Referral

LeadProcessController

SearchResult

Campus

LeadStatus

CampusLocation

BudgetCaps

Contact

ContactDemographic

Program

DegreeLevel

StudyArea Company

Invitation

Enrollment

ReportsController

SchoolsController

BudgetsController

CampusLocationsController

ProgramsController

LeadsController

CompanyController

Delivery LogicMonolithic Rails

App

Saturday, March 19, 2011

Page 39: Refactor Your Monolithic Rails App to a SOA

DeliveryClient

BudgetCaps

BudgetSchool

Search

Lead

Referral

LeadProcessController

SearchResult

Campus

LeadStatus

CampusLocation

BudgetCaps

Contact

ContactDemographic

Program

DegreeLevel

StudyArea Company

Invitation

Enrollment

ReportsController

SchoolsController

BudgetsController

CampusLocationsController

ProgramsController

LeadsController

CompanyController

Delivery LogicMonolithic Rails

App

Saturday, March 19, 2011

Page 40: Refactor Your Monolithic Rails App to a SOA

Legacy Tests As Behavior Scaffolding

Saturday, March 19, 2011

Page 41: Refactor Your Monolithic Rails App to a SOA

describe Contact do describe "#validate" do it "requires 10 digit phone numbers" do ... end

it "rejects blank phone numbers" do ... end

it "rejects areacodes that start with 0 or 1" do ... end

it "requires 5 digit zip" do ... end

it "rejects invalidly formatted emails" do ... end

it "rejects blank emails" do ... end

it "rejects emails with bad words" do ... end ...end

Saturday, March 19, 2011

Page 42: Refactor Your Monolithic Rails App to a SOA

describe Contact do describe "#validate" do it "requires 10 digit phone numbers" do ... end

it "rejects blank phone numbers" do ... end

it "rejects areacodes that start with 0 or 1" do ... end

it "requires 5 digit zip" do ... end

it "rejects invalidly formatted emails" do ... end

it "rejects blank emails" do ... end

it "rejects emails with bad words" do ... end ...end

Phone

Saturday, March 19, 2011

Page 43: Refactor Your Monolithic Rails App to a SOA

describe Contact do describe "#validate" do it "requires 10 digit phone numbers" do ... end

it "rejects blank phone numbers" do ... end

it "rejects areacodes that start with 0 or 1" do ... end

it "requires 5 digit zip" do ... end

it "rejects invalidly formatted emails" do ... end

it "rejects blank emails" do ... end

it "rejects emails with bad words" do ... end ...end

Zip

Saturday, March 19, 2011

Page 44: Refactor Your Monolithic Rails App to a SOA

describe Contact do describe "#validate" do it "requires 10 digit phone numbers" do ... end

it "rejects blank phone numbers" do ... end

it "rejects areacodes that start with 0 or 1" do ... end

it "requires 5 digit zip" do ... end

it "rejects invalidly formatted emails" do ... end

it "rejects blank emails" do ... end

it "rejects emails with bad words" do ... end ...end

Email

Saturday, March 19, 2011

Page 45: Refactor Your Monolithic Rails App to a SOA

describe Phone do describe "#is_satisfied_by?" do

it "returns false if the number is not 10 digits long" do ... end

it "returns false if number matches invalid number list" do ... end

it "returns true if area code is valid" do ... end ... endend

describe Zip do describe "#is_satisfied_by" do

it "returns false if zip is not 5 digits" do ... end

it "returns false if zip does not exist in postal_codes database table" do ... end

... end end

Saturday, March 19, 2011

Page 46: Refactor Your Monolithic Rails App to a SOA

describe Contact do describe "#validate" do it "requires 10 digit phone numbers" do ... end

it "rejects blank phone numbers" do ... end

it "rejects areacodes that start with 0 or 1" do ... end

it "requires 5 digit zip" do ... end

it "rejects invalidly formatted emails" do ... end

it "rejects blank emails" do ... end

it "rejects emails with bad words" do ... end ...end

Saturday, March 19, 2011

Page 47: Refactor Your Monolithic Rails App to a SOA

scrubber = Scrubber.configure do |s| s.scrub(:first_name).as(:invalid).if(:blank) s.scrub(:last_name).as(:invalid).if(:blank) s.scrub(:email).as(:invalid).if(:blank) s.scrub(:phone).as(:invalid).if(:blank)

s.scrub(:first_name).as(:invalid).unless(:kid_friendly) s.scrub(:last_name).as(:invalid).unless(:kid_friendly) s.scrub(:email).as(:invalid).unless(:kid_friendly)

s.scrub(:country).as(:filtered).if {|lead| lead.contact.country == 'Other'}.and_warn("Only requests from the United States can be accepted at this time")

s.scrub_with(:email).as(:filtered) s.scrub_with(:education_level).as(:filtered) s.scrub_with(:duplicate).as(:filtered)end

scrubber.process({ :first_name => "Chris", :last_name => "Wyckoff", :email => "[email protected]", :phone => "8011231234", :country => "US" })

Saturday, March 19, 2011

Page 48: Refactor Your Monolithic Rails App to a SOA

scrubber = Scrubber.configure do |s| s.scrub(:first_name).as(:invalid).if(:blank) s.scrub(:last_name).as(:invalid).if(:blank) s.scrub(:email).as(:invalid).if(:blank) s.scrub(:phone).as(:invalid).if(:blank)

s.scrub(:first_name).as(:invalid).unless(:kid_friendly) s.scrub(:last_name).as(:invalid).unless(:kid_friendly) s.scrub(:email).as(:invalid).unless(:kid_friendly)

s.scrub(:country).as(:filtered).if {|lead| lead.contact.country == 'Other'}.and_warn("Only requests from the United States can be accepted at this time")

s.scrub_with(:email).as(:filtered) s.scrub_with(:education_level).as(:filtered) s.scrub_with(:duplicate).as(:filtered)end

scrubber.process({ :first_name => "Chris", :last_name => "Wyckoff", :email => "[email protected]", :phone => "8011231234", :country => "US" })

Saturday, March 19, 2011

Page 49: Refactor Your Monolithic Rails App to a SOA

scrubber = Scrubber.configure do |s| s.scrub(:first_name).as(:invalid).if(:blank) s.scrub(:last_name).as(:invalid).if(:blank) s.scrub(:email).as(:invalid).if(:blank) s.scrub(:phone).as(:invalid).if(:blank)

s.scrub(:first_name).as(:invalid).unless(:kid_friendly) s.scrub(:last_name).as(:invalid).unless(:kid_friendly) s.scrub(:email).as(:invalid).unless(:kid_friendly)

s.scrub(:country).as(:filtered).if {|lead| lead.contact.country == 'Other'}.and_warn("Only requests from the United States can be accepted at this time")

s.scrub_with(:email).as(:filtered) s.scrub_with(:education_level).as(:filtered) s.scrub_with(:duplicate).as(:filtered)end

scrubber.process({ :first_name => "Chris", :last_name => "Wyckoff", :email => "[email protected]", :phone => "8011231234", :country => "US" })

Saturday, March 19, 2011

Page 50: Refactor Your Monolithic Rails App to a SOA

scrubber = Scrubber.configure do |s| s.scrub(:first_name).as(:invalid).if(:blank) s.scrub(:last_name).as(:invalid).if(:blank) s.scrub(:email).as(:invalid).if(:blank) s.scrub(:phone).as(:invalid).if(:blank)

s.scrub(:first_name).as(:invalid).unless(:kid_friendly) s.scrub(:last_name).as(:invalid).unless(:kid_friendly) s.scrub(:email).as(:invalid).unless(:kid_friendly)

s.scrub(:country).as(:filtered).if {|lead| lead.contact.country == 'Other'}.and_warn("Only requests from the United States can be accepted at this time")

s.scrub_with(:email).as(:filtered) s.scrub_with(:education_level).as(:filtered) s.scrub_with(:duplicate).as(:filtered)end

scrubber.process({ :first_name => "Chris", :last_name => "Wyckoff", :email => "[email protected]", :phone => "8011231234", :country => "US" })

Saturday, March 19, 2011

Page 51: Refactor Your Monolithic Rails App to a SOA

Lather, Rinse, Repeat

Saturday, March 19, 2011

Page 52: Refactor Your Monolithic Rails App to a SOA

LeadQualification

Monolithic RailsApp

Saturday, March 19, 2011

Page 53: Refactor Your Monolithic Rails App to a SOA

LeadDelivery

LeadQualification

Monolithic RailsApp

Saturday, March 19, 2011

Page 54: Refactor Your Monolithic Rails App to a SOA

Cohesion

Saturday, March 19, 2011

Page 55: Refactor Your Monolithic Rails App to a SOA

Scrubbing Engine

Zip Phone EmailParameterized

Rule

Scrubbing DSLScrubber

Conditions Operands

Factory

Qualification Service

Saturday, March 19, 2011

Page 56: Refactor Your Monolithic Rails App to a SOA

Delivery Service

Lead FormatterField Mapper

Get/Post Email FTP/SFTP CustomPhone Date Case Truncate

Lead Deliverer

Get/Post Email FTP/SFTP Custom

Response Handler

Saturday, March 19, 2011

Page 57: Refactor Your Monolithic Rails App to a SOA

Adhesion

Saturday, March 19, 2011

Page 58: Refactor Your Monolithic Rails App to a SOA

DeliveryClient

BudgetCaps

BudgetSchool

Search

Lead

Referral

LeadProcessController

SearchResult

Campus

LeadStatus

CampusLocation

BudgetCaps

Contact

ContactDemographic

Program

DegreeLevel

StudyArea Company

Invitation

Enrollment

ReportsController

SchoolsController

BudgetsController

CampusLocationsController

ProgramsController

LeadsController

CompanyController

Monolithic RailsApp

Saturday, March 19, 2011

Page 59: Refactor Your Monolithic Rails App to a SOA

2. Operate Asynchronously

Saturday, March 19, 2011

Page 60: Refactor Your Monolithic Rails App to a SOA

Client 1Monolithic Rails

App

Saturday, March 19, 2011

Page 61: Refactor Your Monolithic Rails App to a SOA

Client 1

Client 2

Monolithic RailsApp

Saturday, March 19, 2011

Page 62: Refactor Your Monolithic Rails App to a SOA

Client 1

Client 2

Client 3

Monolithic RailsApp

Saturday, March 19, 2011

Page 63: Refactor Your Monolithic Rails App to a SOA

LeadDelivery

Client 1

Client 2

Client 3

Monolithic RailsApp

Saturday, March 19, 2011

Page 64: Refactor Your Monolithic Rails App to a SOA

Client 1

Client 2

Client 3

LeadDelivery

LeadDelivery

LeadDelivery

Monolithic RailsApp

Saturday, March 19, 2011

Page 65: Refactor Your Monolithic Rails App to a SOA

Client 1

Client 2

Client 3

200 ms

LeadDelivery

LeadDelivery

LeadDelivery

Monolithic RailsApp

Saturday, March 19, 2011

Page 66: Refactor Your Monolithic Rails App to a SOA

Client 1

Client 2

Client 3

200 ms

LeadDelivery

LeadDelivery

LeadDelivery

4000 ms

Monolithic RailsApp

Saturday, March 19, 2011

Page 67: Refactor Your Monolithic Rails App to a SOA

Client 1

Client 2

Client 3

200 ms

LeadDelivery

LeadDelivery

LeadDelivery

4000 ms

10000 ms

Monolithic RailsApp

Saturday, March 19, 2011

Page 68: Refactor Your Monolithic Rails App to a SOA

3. Make Incremental Changes

Saturday, March 19, 2011

Page 69: Refactor Your Monolithic Rails App to a SOA

Lead Delivery

Client 1

Client 2

Client 3

Monolithic RailsApp

Saturday, March 19, 2011

Page 70: Refactor Your Monolithic Rails App to a SOA

Router

LeadDelivery

Client 1

Client 1

Client 2

Client 3

Monolithic RailsApp

Saturday, March 19, 2011

Page 71: Refactor Your Monolithic Rails App to a SOA

Monolithic RailsApp

LeadDelivery

Client 1

Client 1

Client 2

Client 3

Router

Saturday, March 19, 2011

Page 72: Refactor Your Monolithic Rails App to a SOA

class DeliveryRouter

def self.route(lead) if(publishable_to_new_delivery?(self)) DeliveryRouter.publish(lead) else lead.submit end end

def self.publish(lead) Bunny.publish(:lead_delivery, DeliveryMapper.map(lead)) end def self.publishable_to_new_delivery?(lead) lead.school.active_for_new_delivery? end end

Saturday, March 19, 2011

Page 73: Refactor Your Monolithic Rails App to a SOA

class DeliveryRouter

def self.route(lead) if(publishable_to_new_delivery?(self)) DeliveryRouter.publish(lead) else lead.submit end end

def self.publish(lead) Bunny.publish(:lead_delivery, DeliveryMapper.map(lead)) end def self.publishable_to_new_delivery?(lead) lead.school.active_for_new_delivery? end end

Saturday, March 19, 2011

Page 74: Refactor Your Monolithic Rails App to a SOA

class DeliveryRouter

def self.route(lead) if(publishable_to_new_delivery?(self)) DeliveryRouter.publish(lead) else lead.submit end end

def self.publish(lead) Bunny.publish(:lead_delivery, DeliveryMapper.map(lead)) end def self.publishable_to_new_delivery?(lead) lead.school.active_for_new_delivery? end end

Saturday, March 19, 2011

Page 75: Refactor Your Monolithic Rails App to a SOA

class DeliveryMapper

def self.map(lead) { :first_name => lead.contact.first_name, :last_name => lead.contact.last_name, :address => lead.contact.address, :city => lead.contact.city, :state => lead.contact.state, :zip => lead.contact.zip, :phone => lead.contact.phone, :email => lead.contact.email, :client_id => lead.client.id, :lead_id => lead.id, ... } end

end

Saturday, March 19, 2011

Page 76: Refactor Your Monolithic Rails App to a SOA

class DeliveryRouter

def self.route(lead) if(publishable_to_new_delivery?(self)) DeliveryRouter.publish(lead) else lead.submit end end

def self.publish(lead) Bunny.publish(:lead_delivery, DeliveryMapper.map(lead)) end def self.publishable_to_new_delivery?(lead) lead.school.active_for_new_delivery? end end

Saturday, March 19, 2011

Page 77: Refactor Your Monolithic Rails App to a SOA

Router

LeadDelivery

Client 1

Client 1

Client 2

Client 3

Monolithic RailsApp

Saturday, March 19, 2011

Page 78: Refactor Your Monolithic Rails App to a SOA

LeadDelivery

Client 1

Client 2

Client 3

Legacy Delivery Code

Monolithic RailsApp

Saturday, March 19, 2011

Page 79: Refactor Your Monolithic Rails App to a SOA

What Did We Gain?

Saturday, March 19, 2011

Page 80: Refactor Your Monolithic Rails App to a SOA

Speed

Saturday, March 19, 2011

Page 81: Refactor Your Monolithic Rails App to a SOA

Maintainability

Saturday, March 19, 2011

Page 82: Refactor Your Monolithic Rails App to a SOA

Testability

Saturday, March 19, 2011

Page 83: Refactor Your Monolithic Rails App to a SOA

Composability

Saturday, March 19, 2011

Page 84: Refactor Your Monolithic Rails App to a SOA

SourceLead

QualificationLead

Delivery

Saturday, March 19, 2011

Page 85: Refactor Your Monolithic Rails App to a SOA

SourceLead

DeliveryLead

QualificationLead

Assignment

Saturday, March 19, 2011

Page 86: Refactor Your Monolithic Rails App to a SOA

SourceLead

QualificationLead

DeliveryCall

Center

Call Center

LeadDelivery Client

Saturday, March 19, 2011

Page 87: Refactor Your Monolithic Rails App to a SOA

LeadQualification

LeadDelivery

LeadDelivery

LeadAssignment

LeadDelivery

Call Center

LeadDelivery Client

Saturday, March 19, 2011

Page 88: Refactor Your Monolithic Rails App to a SOA

Education

LeadDelivery

LeadQualification

Employment

Loan Financing

Saturday, March 19, 2011

Page 89: Refactor Your Monolithic Rails App to a SOA

LeadQualification

LeadDelivery

EmailRemarketing

RabbitMQ

LeadConversion

Reporting

BudgetServiceAdmin

Saturday, March 19, 2011

Page 90: Refactor Your Monolithic Rails App to a SOA

{'event':'delivery','status':'accepted','lead_id':'1234','timestamp':'2011-02-23 08:09:01','lead_details':{

...}

}

Saturday, March 19, 2011

Page 91: Refactor Your Monolithic Rails App to a SOA

LeadQualification

LeadDelivery

EmailRemarketing

RabbitMQ

LeadConversion

Reporting

BudgetServiceAdmin

Saturday, March 19, 2011

Page 92: Refactor Your Monolithic Rails App to a SOA

LeadQualification

LeadDelivery

EmailRemarketing

RabbitMQ

LeadConversion

Reporting

BudgetServiceAdmin

Saturday, March 19, 2011

Page 93: Refactor Your Monolithic Rails App to a SOA

LeadQualification

LeadDelivery

EmailRemarketing

RabbitMQ

LeadConversion

Reporting

BudgetServiceAdmin

Saturday, March 19, 2011

Page 94: Refactor Your Monolithic Rails App to a SOA

LeadQualification

LeadDelivery

EmailRemarketing

RabbitMQ

LeadConversion

Reporting

BudgetServiceAdmin

Saturday, March 19, 2011

Page 95: Refactor Your Monolithic Rails App to a SOA

What Did We Risk?

Saturday, March 19, 2011

Page 96: Refactor Your Monolithic Rails App to a SOA

Maintainability

Saturday, March 19, 2011

Page 97: Refactor Your Monolithic Rails App to a SOA

Testability

Saturday, March 19, 2011

Page 98: Refactor Your Monolithic Rails App to a SOA

Combat over-decomposition by consolidating code w/o necessarily isolating it as a service

1) gems2) local CouchDB stores that sync w/ a master store

Overly Decomposed Services

Saturday, March 19, 2011

Page 99: Refactor Your Monolithic Rails App to a SOA

LeadQualification

LeadDelivery

EmailRemarketing

FieldFormatting

Rules Engine

SurveyEngine

Saturday, March 19, 2011

Page 100: Refactor Your Monolithic Rails App to a SOA

LeadQualification

LeadDelivery

EmailRemarketing

FieldFormatting

Rules Engine

SurveyEngine

Saturday, March 19, 2011

Page 101: Refactor Your Monolithic Rails App to a SOA

LeadQualification

LeadDelivery

EmailRemarketing

FieldFormatting

Rules Engine

SurveyEngine

Saturday, March 19, 2011

Page 102: Refactor Your Monolithic Rails App to a SOA

LeadQualification

LeadDelivery

EmailRemarketing

FieldFormatting

Rules Engine

SurveyEngine

Saturday, March 19, 2011

Page 103: Refactor Your Monolithic Rails App to a SOA

LeadQualification

LeadDelivery

EmailRemarketing

FieldFormatting

Rules Engine

SurveyEngine

Saturday, March 19, 2011

Page 104: Refactor Your Monolithic Rails App to a SOA

LeadQualification

LeadDelivery

EmailRemarketing

SurveyEngine

Saturday, March 19, 2011

Page 105: Refactor Your Monolithic Rails App to a SOA

LeadDelivery

Saturday, March 19, 2011

Page 106: Refactor Your Monolithic Rails App to a SOA

LeadQualification

LeadDelivery

EmailRemarketing

SurveyEngine

Saturday, March 19, 2011

Page 107: Refactor Your Monolithic Rails App to a SOA

Saturday, March 19, 2011

Page 108: Refactor Your Monolithic Rails App to a SOA

Map Your Architecture

Saturday, March 19, 2011

Page 110: Refactor Your Monolithic Rails App to a SOA

Saturday, March 19, 2011

Page 111: Refactor Your Monolithic Rails App to a SOA

Thank You.

Questions?

Saturday, March 19, 2011