SlideShare a Scribd company logo
Refactoring Your
                     Monolithic Rails App
                         To A SOA:

                           Risks and Rewards


Saturday, March 19, 2011
Chris Wyckoff
                           Alliance Health Networks
                                cbwyckoff@gmail.com
                                    @cwyckoff




Saturday, March 19, 2011
The Birth Of A Monolithic Rails App:

                           A Simple Survey Engine




Saturday, March 19, 2011
Saturday, March 19, 2011
Saturday, March 19, 2011
Saturday, March 19, 2011
Saturday, March 19, 2011
Saturday, March 19, 2011
Saturday, March 19, 2011
Pretty Simple App, huh?




Saturday, March 19, 2011
“But we need to remarket all those emails.”




Saturday, March 19, 2011
Saturday, March 19, 2011
“We need more complex surveys.”




Saturday, March 19, 2011
Saturday, March 19, 2011
“Now we need an admin. And where’s our reporting?”




Saturday, March 19, 2011
Saturday, March 19, 2011
“Some clients need SOAP deliveries.”




Saturday, March 19, 2011
Saturday, March 19, 2011
And so on for 4 years.
                            Until...


Saturday, March 19, 2011
“What’s wrong with the site guys?”




Saturday, March 19, 2011
1. Slow
            2. Buggy
            3. New Features Take Forever To Implement
            4. Deploys Are A Nightmare
            5. Tons Of Dependencies



Saturday, March 19, 2011
We Needed To Go From This...




Saturday, March 19, 2011
Monolithic Rails
                                                       App                                       Company
                                                                                                 Controller
                                                                             Contact
                                              Lead
               Invitation                                    Contact       Demographic
                                             Status
                                                                                               Enrollment
                                                                            Degree
                           LeadProcess                                       Level
                            Controller                 Lead
                                                                                Study
                                                                 Program                        Company
                                                                                Area
                            Referral
        Leads
                                                    School                                  Delivery
      Controller                                                           Budget
                                                                                             Client
                            Search
                                                                                                     Programs
                                                        Campus         Budget        Budget          Controller
                 Reports                                                Caps          Caps
                                          Search
                Controller
                                          Result                       Campus
                                                                       Location          Campus
                              Schools               Budgets                             Locations
                             Controller            Controller                           Controller

Saturday, March 19, 2011
To This...




Saturday, March 19, 2011
Lead                      Lead             Email         Lead
        Qualification                Delivery       Remarketing    Conversion




                                          RabbitMQ
           Operational                                            Reporting
           Data Stores


                           Survey                           Budget
                                               Admin
                           Engine                           Service


Saturday, March 19, 2011
Lead                      Lead             Email         Lead
        Qualification                Delivery       Remarketing    Conversion




                                          RabbitMQ
           Operational                                            Reporting
           Data Stores


                           Survey                           Budget
                                               Admin
                           Engine                           Service


Saturday, March 19, 2011
Lead                      Lead             Email         Lead
        Qualification                Delivery       Remarketing    Conversion




                                          RabbitMQ
           Operational                                            Reporting
           Data Stores


                           Survey                           Budget
                                               Admin
                           Engine                           Service


Saturday, March 19, 2011
Lead                      Lead             Email         Lead
        Qualification                Delivery       Remarketing    Conversion




                                          RabbitMQ
           Operational                                            Reporting
           Data Stores


                           Survey                           Budget
                                               Admin
                           Engine                           Service


Saturday, March 19, 2011
But How?




Saturday, March 19, 2011
The Strangler Approach



                                  Good Code




                  Bad Code




Saturday, March 19, 2011
3 Drivers To Our ‘Strangler’ Approach:

                           1. Separate Responsibilities
                           2. Operate Asynchronously
                           3. Make Incremental Changes




Saturday, March 19, 2011
1. Separate Responsibilities




Saturday, March 19, 2011
Consolidate Like Functionality




Saturday, March 19, 2011
Qualification                                 Monolithic Rails
        Logic                                          App                                       Company
                                                                                                 Controller
                                                                             Contact
                                              Lead
               Invitation                                    Contact       Demographic
                                             Status
                                                                                               Enrollment
                                                                            Degree
                           LeadProcess                                       Level
                            Controller                 Lead
                                                                                Study
                                                                 Program                        Company
                                                                                Area
                            Referral
        Leads
                                                    School                                  Delivery
      Controller                                                           Budget
                                                                                             Client
                            Search
                                                                                                     Programs
                                                        Campus         Budget        Budget          Controller
                 Reports                                                Caps          Caps
                                          Search
                Controller
                                          Result                       Campus
                                                                       Location          Campus
                              Schools               Budgets                             Locations
                             Controller            Controller                           Controller

Saturday, March 19, 2011
Qualification
                                              Monolithic Rails
                                         Logic      App                                          Company
                                                                                                 Controller
                                                                             Contact
                                              Lead
               Invitation                                    Contact       Demographic
                                             Status
                                                                                               Enrollment
                                                                            Degree
                           LeadProcess                                       Level
                            Controller                 Lead
                                                                                Study
                                                                 Program                        Company
                                                                                Area
                            Referral
        Leads
                                                    School                                  Delivery
      Controller                                                           Budget
                                                                                             Client
                            Search
                                                                                                     Programs
                                                        Campus         Budget        Budget          Controller
                 Reports                                                Caps          Caps
                                          Search
                Controller
                                          Result                       Campus
                                                                       Location          Campus
                              Schools               Budgets                             Locations
                             Controller            Controller                           Controller

Saturday, March 19, 2011
Qualification
                                                   Monolithic Rails
                                                       App          Logic                        Company
                                                                                                 Controller
                                                                             Contact
                                              Lead
               Invitation                                    Contact       Demographic
                                             Status
                                                                                               Enrollment
                                                                            Degree
                           LeadProcess                                       Level
                            Controller                 Lead
                                                                                Study
                                                                 Program                        Company
                                                                                Area
                            Referral
        Leads
                                                    School                                  Delivery
      Controller                                                           Budget
                                                                                             Client
                            Search
                                                                                                     Programs
                                                        Campus         Budget        Budget          Controller
                 Reports                                                Caps          Caps
                                          Search
                Controller
                                          Result                       Campus
                                                                       Location          Campus
                              Schools               Budgets                             Locations
                             Controller            Controller                           Controller

Saturday, March 19, 2011
Monolithic Rails
                           Qualification
                                                       App                                       Company
                             Logic                                                               Controller
                                                                             Contact
                                              Lead
               Invitation                                    Contact       Demographic
                                             Status
                                                                                               Enrollment
                                                                            Degree
                           LeadProcess                                       Level
                            Controller                 Lead
                                                                                Study
                                                                 Program                        Company
                                                                                Area
                            Referral
        Leads
                                                    School                                  Delivery
      Controller                                                           Budget
                                                                                             Client
                            Search
                                                                                                     Programs
                                                        Campus         Budget        Budget          Controller
                 Reports                                                Caps          Caps
                                          Search
                Controller
                                          Result                       Campus
                                                                       Location          Campus
                              Schools               Budgets                             Locations
                             Controller            Controller                           Controller

Saturday, March 19, 2011
Monolithic Rails
                                                       App          Delivery Logic
                                                                               Company
                                                                               Controller
                                                                             Contact
                                              Lead
               Invitation                                    Contact       Demographic
                                             Status
                                                                                               Enrollment
                                                                            Degree
                           LeadProcess                                       Level
                            Controller                 Lead
                                                                                Study
                                                                 Program                        Company
                                                                                Area
                            Referral
        Leads
                                                    School                                  Delivery
      Controller                                                           Budget
                                                                                             Client
                            Search
                                                                                                     Programs
                                                        Campus         Budget        Budget          Controller
                 Reports                                                Caps          Caps
                                          Search
                Controller
                                          Result                       Campus
                                                                       Location          Campus
                              Schools               Budgets                             Locations
                             Controller            Controller                           Controller

Saturday, March 19, 2011
Monolithic Rails
                      Delivery Logic                   App                                       Company
                                                                                                 Controller
                                                                             Contact
                                              Lead
               Invitation                                    Contact       Demographic
                                             Status
                                                                                               Enrollment
                                                                            Degree
                           LeadProcess                                       Level
                            Controller                 Lead
                                                                                Study
                                                                 Program                        Company
                                                                                Area
                            Referral
        Leads
                                                    School                                  Delivery
      Controller                                                           Budget
                                                                                             Client
                            Search
                                                                                                     Programs
                                                        Campus         Budget        Budget          Controller
                 Reports                                                Caps          Caps
                                          Search
                Controller
                                          Result                       Campus
                                                                       Location          Campus
                              Schools               Budgets                             Locations
                             Controller            Controller                           Controller

Saturday, March 19, 2011
Legacy Tests As Behavior Scaffolding




Saturday, March 19, 2011
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
describe Contact do
                        describe "#validate" do

                            it "requires 10 digit phone numbers" do
                                                                               Phone
                              ...
                            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
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
                              ...
                                                                               Zip
                            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
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
                              ...
                                                                               Email
                            end

                            it "rejects blank emails" do
                              ...
                            end

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


Saturday, March 19, 2011
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

                          ...
                        end
                      end

                      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
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
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 => "foo@yahoo.com",
            :phone => "8011231234",
            :country => "US"
            })




Saturday, March 19, 2011
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 => "foo@yahoo.com",
            :phone => "8011231234",
            :country => "US"
            })




Saturday, March 19, 2011
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 => "foo@yahoo.com",
            :phone => "8011231234",
            :country => "US"
            })




Saturday, March 19, 2011
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 => "foo@yahoo.com",
            :phone => "8011231234",
            :country => "US"
            })




Saturday, March 19, 2011
Lather, Rinse, Repeat




Saturday, March 19, 2011
Monolithic Rails
                   App
                                     Lead
                                  Qualification




Saturday, March 19, 2011
Monolithic Rails
                   App
                                     Lead         Lead
                                  Qualification   Delivery




Saturday, March 19, 2011
Cohesion




Saturday, March 19, 2011
Qualification Service

                               Factory




                              Scrubber                         Scrubbing DSL



                                                              Conditions   Operands
                           Scrubbing Engine



                                              Parameterized
                   Zip       Phone   Email
                                                  Rule
Saturday, March 19, 2011
Delivery Service


                           Field Mapper                            Lead Formatter



            Phone            Date     Case   Truncate      Get/Post   Email   FTP/SFTP Custom




                       Lead Deliverer                             Response Handler



        Get/Post           Email    FTP/SFTP Custom

Saturday, March 19, 2011
Adhesion




Saturday, March 19, 2011
Monolithic Rails
                                                       App                                       Company
                                                                                                 Controller
                                                                             Contact
                                              Lead
               Invitation                                    Contact       Demographic
                                             Status
                                                                                               Enrollment
                                                                            Degree
                           LeadProcess                                       Level
                            Controller                 Lead
                                                                                Study
                                                                 Program                        Company
                                                                                Area
                            Referral
        Leads
                                                    School                                  Delivery
      Controller                                                           Budget
                                                                                             Client
                            Search
                                                                                                     Programs
                                                        Campus         Budget        Budget          Controller
                 Reports                                                Caps          Caps
                                          Search
                Controller
                                          Result                       Campus
                                                                       Location          Campus
                              Schools               Budgets                             Locations
                             Controller            Controller                           Controller

Saturday, March 19, 2011
2. Operate Asynchronously




Saturday, March 19, 2011
Client 1
               Monolithic Rails
                   App




Saturday, March 19, 2011
Client 1
               Monolithic Rails
                   App
                                  Client 2




Saturday, March 19, 2011
Client 1
               Monolithic Rails
                   App
                                  Client 2




                                  Client 3




Saturday, March 19, 2011
Client 1
               Monolithic Rails
                   App
                                   Lead
                                  Delivery   Client 2




                                             Client 3




Saturday, March 19, 2011
Lead
                                             Client 1
               Monolithic Rails   Delivery
                   App
                                   Lead
                                             Client 2
                                  Delivery



                                   Lead
                                             Client 3
                                  Delivery




Saturday, March 19, 2011
Lead
                                                      Client 1
               Monolithic Rails   Delivery
                   App
                                   Lead      200 ms
                                                      Client 2
                                  Delivery



                                   Lead
                                                      Client 3
                                  Delivery




Saturday, March 19, 2011
Lead
                                                       Client 1
               Monolithic Rails   Delivery
                   App
                                   Lead      200 ms
                                                       Client 2
                                  Delivery



                                   Lead      4000 ms
                                                       Client 3
                                  Delivery




Saturday, March 19, 2011
Lead      10000 ms
                                                        Client 1
               Monolithic Rails   Delivery
                   App
                                   Lead      200 ms
                                                        Client 2
                                  Delivery



                                   Lead      4000 ms
                                                        Client 3
                                  Delivery




Saturday, March 19, 2011
3. Make Incremental Changes




Saturday, March 19, 2011
Client 1
               Monolithic Rails
                   App
                       Lead Delivery   Client 2




                                       Client 3




Saturday, March 19, 2011
Monolithic Rails
                                    Client 1
                   App
                                               Client 1
                           Router



                                     Lead      Client 2
                                    Delivery


                                               Client 3



Saturday, March 19, 2011
Monolithic Rails
                                    Client 1
                   App
                                               Client 1
                           Router



                                     Lead      Client 2
                                    Delivery


                                               Client 3



Saturday, March 19, 2011
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
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
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
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
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
Monolithic Rails
                                    Client 1
                   App
                                               Client 1
                           Router



                                     Lead      Client 2
                                    Delivery


                                               Client 3



Saturday, March 19, 2011
Client 1
               Monolithic Rails
                   App
                                         Lead
                 Legacy Delivery Code   Delivery   Client 2




                                                   Client 3




Saturday, March 19, 2011
What Did We Gain?




Saturday, March 19, 2011
Speed




Saturday, March 19, 2011
Maintainability




Saturday, March 19, 2011
Testability




Saturday, March 19, 2011
Composability




Saturday, March 19, 2011
Lead         Lead
       Source              Qualification   Delivery




Saturday, March 19, 2011
Lead           Lead       Lead
       Source              Qualification   Assignment   Delivery




Saturday, March 19, 2011
Lead         Lead       Call
       Source              Qualification   Delivery   Center




       Call                  Lead
                            Delivery       Client
      Center




Saturday, March 19, 2011
Lead                Lead
                           Assignment            Delivery




       Lead                         Lead
    Qualification                   Delivery




                      Lead               Call            Lead
                     Delivery                           Delivery   Client
                                        Center


Saturday, March 19, 2011
Education



                   Employment

                                     Lead         Lead
                                  Qualification   Delivery
                Loan Financing




Saturday, March 19, 2011
Lead                     Lead             Email        Lead
        Qualification               Delivery       Remarketing   Conversion




                                       RabbitMQ

                                                                Reporting

                                              Budget
                           Admin              Service


Saturday, March 19, 2011
{
                           'event':'delivery',
                           'status':'accepted',
                           'lead_id':'1234',
                           'timestamp':'2011-02-23 08:09:01',
                           'lead_details':{
                                ...
                              }
                           }



Saturday, March 19, 2011
Lead                     Lead             Email        Lead
        Qualification               Delivery       Remarketing   Conversion




                                       RabbitMQ

                                                                Reporting

                                              Budget
                           Admin              Service


Saturday, March 19, 2011
Lead                     Lead             Email        Lead
        Qualification               Delivery       Remarketing   Conversion




                                       RabbitMQ

                                                                Reporting

                                              Budget
                           Admin              Service


Saturday, March 19, 2011
Lead                     Lead             Email        Lead
        Qualification               Delivery       Remarketing   Conversion




                                       RabbitMQ

                                                                Reporting

                                              Budget
                           Admin              Service


Saturday, March 19, 2011
Lead                     Lead             Email        Lead
        Qualification               Delivery       Remarketing   Conversion




                                       RabbitMQ

                                                                Reporting

                                              Budget
                           Admin              Service


Saturday, March 19, 2011
What Did We Risk?




Saturday, March 19, 2011
Maintainability




Saturday, March 19, 2011
Testability




Saturday, March 19, 2011
Overly Decomposed Services
                                        Combat over-decomposition by
                                        consolidating code w/o necessarily
                                        isolating it as a ser vice

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




Saturday, March 19, 2011
Lead          Lead         Email
                           Qualification    Delivery   Remarketing




          Survey
          Engine



                                      Field           Rules
                                   Formatting         Engine



Saturday, March 19, 2011
Lead          Lead         Email
                           Qualification    Delivery   Remarketing




          Survey
          Engine



                                      Field           Rules
                                   Formatting         Engine



Saturday, March 19, 2011
Lead          Lead         Email
                           Qualification    Delivery   Remarketing




          Survey
          Engine



                                      Field           Rules
                                   Formatting         Engine



Saturday, March 19, 2011
Lead          Lead         Email
                           Qualification    Delivery   Remarketing




          Survey
          Engine



                                      Field           Rules
                                   Formatting         Engine



Saturday, March 19, 2011
Lead          Lead         Email
                           Qualification    Delivery   Remarketing




          Survey
          Engine



                                      Field           Rules
                                   Formatting         Engine



Saturday, March 19, 2011
Lead         Lead         Email
                           Qualification   Delivery   Remarketing




          Survey
          Engine




Saturday, March 19, 2011
Lead
                           Delivery




Saturday, March 19, 2011
Lead         Lead         Email
                           Qualification   Delivery   Remarketing




          Survey
          Engine




Saturday, March 19, 2011
Saturday, March 19, 2011
Map Your Architecture




Saturday, March 19, 2011
1) http://www.vanderburg.org/Blog/Software/Development/
   cohesion.rdoc

   2) http://www.martinfowler.com/blikiStranglerApplication.html

   3) http://www.eaipatterns.com/docs/EDA.pdf




Saturday, March 19, 2011
Saturday, March 19, 2011
Thank You.

                           Questions?



Saturday, March 19, 2011

More Related Content

Viewers also liked (6)

PPTX
How I learned to stop worrying and love the cloud
Shlomo Swidler
 
PDF
Spotify: Data center & Backend buildout
David Poblador i Garcia
 
PDF
Choosing the Right Framework for Running Docker Containers in Prod
Josh Padnick
 
PPTX
Zuul @ Netflix SpringOne Platform
Mikey Cohen - Hiring Amazing Engineers
 
PDF
Microservices at Spotify
Kevin Goldsmith
 
PPTX
Micro Service Architecture
Eduards Sizovs
 
How I learned to stop worrying and love the cloud
Shlomo Swidler
 
Spotify: Data center & Backend buildout
David Poblador i Garcia
 
Choosing the Right Framework for Running Docker Containers in Prod
Josh Padnick
 
Zuul @ Netflix SpringOne Platform
Mikey Cohen - Hiring Amazing Engineers
 
Microservices at Spotify
Kevin Goldsmith
 
Micro Service Architecture
Eduards Sizovs
 

Similar to Refactor Your Monolithic Rails App to a SOA (20)

KEY
Designing the User Experience
Jason Wehmhoener
 
PPTX
MyVisual Resume
Chris Norton
 
PDF
Peak Corporate Presentation
russlombardo
 
PPTX
Understanding your customer market
Dieter Hovorka
 
POT
Shoretel Global Services
axjt1017
 
PDF
Linkroad Corporate Snapshot
melvinyou
 
PDF
My Visual Resume for Echovme
Ramesh Kumar
 
PDF
Fortunewest Business Development
Dabarrington
 
PPSX
Work done at MARG in FY 2011-12
Amol Vidwans
 
PDF
Curriculum Vitae Amarnath Gupta Programme Manager With 6.5 Yrs Experience
Amarnath Gupta
 
DOC
Curriculum Vitae Amarnath Gupta Programme Manager With 6.5 Yrs Experience
Amarnath Gupta
 
PDF
Accelarating Customer Relationships
Cequity Solutions
 
PDF
Acl Presentation 3 4 10 Final
mcoello
 
PDF
Quantifying Outreach
Michael King
 
PDF
Win and Manage more Government Business with GovWin CRM
marcomm2
 
PDF
Clarify And Connect 4 12 10
gomezgrp
 
PPTX
Tools for Pulling Rank by Michael King for SMX Advanced
iAcquire
 
PPTX
Benefiting from a Quality Problem Management Program v2
McGarahan & Associates, Inc.
 
PDF
Notes Version: Email Marketing Workshop Closing Now What
Vivastream
 
PDF
Notes Version: Email Marketing Workshop Closing Now What
Vivastream
 
Designing the User Experience
Jason Wehmhoener
 
MyVisual Resume
Chris Norton
 
Peak Corporate Presentation
russlombardo
 
Understanding your customer market
Dieter Hovorka
 
Shoretel Global Services
axjt1017
 
Linkroad Corporate Snapshot
melvinyou
 
My Visual Resume for Echovme
Ramesh Kumar
 
Fortunewest Business Development
Dabarrington
 
Work done at MARG in FY 2011-12
Amol Vidwans
 
Curriculum Vitae Amarnath Gupta Programme Manager With 6.5 Yrs Experience
Amarnath Gupta
 
Curriculum Vitae Amarnath Gupta Programme Manager With 6.5 Yrs Experience
Amarnath Gupta
 
Accelarating Customer Relationships
Cequity Solutions
 
Acl Presentation 3 4 10 Final
mcoello
 
Quantifying Outreach
Michael King
 
Win and Manage more Government Business with GovWin CRM
marcomm2
 
Clarify And Connect 4 12 10
gomezgrp
 
Tools for Pulling Rank by Michael King for SMX Advanced
iAcquire
 
Benefiting from a Quality Problem Management Program v2
McGarahan & Associates, Inc.
 
Notes Version: Email Marketing Workshop Closing Now What
Vivastream
 
Notes Version: Email Marketing Workshop Closing Now What
Vivastream
 
Ad

Recently uploaded (20)

PDF
Log-Based Anomaly Detection: Enhancing System Reliability with Machine Learning
Mohammed BEKKOUCHE
 
PDF
CIFDAQ Token Spotlight for 9th July 2025
CIFDAQ
 
PDF
TrustArc Webinar - Data Privacy Trends 2025: Mid-Year Insights & Program Stra...
TrustArc
 
PDF
Complete JavaScript Notes: From Basics to Advanced Concepts.pdf
haydendavispro
 
PDF
How Startups Are Growing Faster with App Developers in Australia.pdf
India App Developer
 
PPTX
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
PDF
Building Resilience with Digital Twins : Lessons from Korea
SANGHEE SHIN
 
PDF
Transcript: New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
PDF
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 
PDF
Why Orbit Edge Tech is a Top Next JS Development Company in 2025
mahendraalaska08
 
PPTX
✨Unleashing Collaboration: Salesforce Channels & Community Power in Patna!✨
SanjeetMishra29
 
PDF
CIFDAQ Weekly Market Wrap for 11th July 2025
CIFDAQ
 
PDF
SWEBOK Guide and Software Services Engineering Education
Hironori Washizaki
 
PDF
Smart Air Quality Monitoring with Serrax AQM190 LITE
SERRAX TECHNOLOGIES LLP
 
PPTX
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
PDF
Complete Network Protection with Real-Time Security
L4RGINDIA
 
PDF
SFWelly Summer 25 Release Highlights July 2025
Anna Loughnan Colquhoun
 
PPT
Interview paper part 3, It is based on Interview Prep
SoumyadeepGhosh39
 
PDF
Human-centred design in online workplace learning and relationship to engagem...
Tracy Tang
 
PDF
Presentation - Vibe Coding The Future of Tech
yanuarsinggih1
 
Log-Based Anomaly Detection: Enhancing System Reliability with Machine Learning
Mohammed BEKKOUCHE
 
CIFDAQ Token Spotlight for 9th July 2025
CIFDAQ
 
TrustArc Webinar - Data Privacy Trends 2025: Mid-Year Insights & Program Stra...
TrustArc
 
Complete JavaScript Notes: From Basics to Advanced Concepts.pdf
haydendavispro
 
How Startups Are Growing Faster with App Developers in Australia.pdf
India App Developer
 
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
Building Resilience with Digital Twins : Lessons from Korea
SANGHEE SHIN
 
Transcript: New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 
Why Orbit Edge Tech is a Top Next JS Development Company in 2025
mahendraalaska08
 
✨Unleashing Collaboration: Salesforce Channels & Community Power in Patna!✨
SanjeetMishra29
 
CIFDAQ Weekly Market Wrap for 11th July 2025
CIFDAQ
 
SWEBOK Guide and Software Services Engineering Education
Hironori Washizaki
 
Smart Air Quality Monitoring with Serrax AQM190 LITE
SERRAX TECHNOLOGIES LLP
 
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
Complete Network Protection with Real-Time Security
L4RGINDIA
 
SFWelly Summer 25 Release Highlights July 2025
Anna Loughnan Colquhoun
 
Interview paper part 3, It is based on Interview Prep
SoumyadeepGhosh39
 
Human-centred design in online workplace learning and relationship to engagem...
Tracy Tang
 
Presentation - Vibe Coding The Future of Tech
yanuarsinggih1
 
Ad

Refactor Your Monolithic Rails App to a SOA

  • 1. Refactoring Your Monolithic Rails App To A SOA: Risks and Rewards Saturday, March 19, 2011
  • 2. Chris Wyckoff Alliance Health Networks [email protected] @cwyckoff Saturday, March 19, 2011
  • 3. The Birth Of A Monolithic Rails App: A Simple Survey Engine Saturday, March 19, 2011
  • 10. Pretty Simple App, huh? Saturday, March 19, 2011
  • 11. “But we need to remarket all those emails.” Saturday, March 19, 2011
  • 13. “We need more complex surveys.” Saturday, March 19, 2011
  • 15. “Now we need an admin. And where’s our reporting?” Saturday, March 19, 2011
  • 17. “Some clients need SOAP deliveries.” Saturday, March 19, 2011
  • 19. And so on for 4 years. Until... Saturday, March 19, 2011
  • 20. “What’s wrong with the site guys?” Saturday, March 19, 2011
  • 21. 1. Slow 2. Buggy 3. New Features Take Forever To Implement 4. Deploys Are A Nightmare 5. Tons Of Dependencies Saturday, March 19, 2011
  • 22. We Needed To Go From This... Saturday, March 19, 2011
  • 23. Monolithic Rails App Company Controller Contact Lead Invitation Contact Demographic Status Enrollment Degree LeadProcess Level Controller Lead Study Program Company Area Referral Leads School Delivery Controller Budget Client Search Programs Campus Budget Budget Controller Reports Caps Caps Search Controller Result Campus Location Campus Schools Budgets Locations Controller Controller Controller Saturday, March 19, 2011
  • 25. Lead Lead Email Lead Qualification Delivery Remarketing Conversion RabbitMQ Operational Reporting Data Stores Survey Budget Admin Engine Service Saturday, March 19, 2011
  • 26. Lead Lead Email Lead Qualification Delivery Remarketing Conversion RabbitMQ Operational Reporting Data Stores Survey Budget Admin Engine Service Saturday, March 19, 2011
  • 27. Lead Lead Email Lead Qualification Delivery Remarketing Conversion RabbitMQ Operational Reporting Data Stores Survey Budget Admin Engine Service Saturday, March 19, 2011
  • 28. Lead Lead Email Lead Qualification Delivery Remarketing Conversion RabbitMQ Operational Reporting Data Stores Survey Budget Admin Engine Service Saturday, March 19, 2011
  • 30. The Strangler Approach Good Code Bad Code Saturday, March 19, 2011
  • 31. 3 Drivers To Our ‘Strangler’ Approach: 1. Separate Responsibilities 2. Operate Asynchronously 3. Make Incremental Changes Saturday, March 19, 2011
  • 34. Qualification Monolithic Rails Logic App Company Controller Contact Lead Invitation Contact Demographic Status Enrollment Degree LeadProcess Level Controller Lead Study Program Company Area Referral Leads School Delivery Controller Budget Client Search Programs Campus Budget Budget Controller Reports Caps Caps Search Controller Result Campus Location Campus Schools Budgets Locations Controller Controller Controller Saturday, March 19, 2011
  • 35. Qualification Monolithic Rails Logic App Company Controller Contact Lead Invitation Contact Demographic Status Enrollment Degree LeadProcess Level Controller Lead Study Program Company Area Referral Leads School Delivery Controller Budget Client Search Programs Campus Budget Budget Controller Reports Caps Caps Search Controller Result Campus Location Campus Schools Budgets Locations Controller Controller Controller Saturday, March 19, 2011
  • 36. Qualification Monolithic Rails App Logic Company Controller Contact Lead Invitation Contact Demographic Status Enrollment Degree LeadProcess Level Controller Lead Study Program Company Area Referral Leads School Delivery Controller Budget Client Search Programs Campus Budget Budget Controller Reports Caps Caps Search Controller Result Campus Location Campus Schools Budgets Locations Controller Controller Controller Saturday, March 19, 2011
  • 37. Monolithic Rails Qualification App Company Logic Controller Contact Lead Invitation Contact Demographic Status Enrollment Degree LeadProcess Level Controller Lead Study Program Company Area Referral Leads School Delivery Controller Budget Client Search Programs Campus Budget Budget Controller Reports Caps Caps Search Controller Result Campus Location Campus Schools Budgets Locations Controller Controller Controller Saturday, March 19, 2011
  • 38. Monolithic Rails App Delivery Logic Company Controller Contact Lead Invitation Contact Demographic Status Enrollment Degree LeadProcess Level Controller Lead Study Program Company Area Referral Leads School Delivery Controller Budget Client Search Programs Campus Budget Budget Controller Reports Caps Caps Search Controller Result Campus Location Campus Schools Budgets Locations Controller Controller Controller Saturday, March 19, 2011
  • 39. Monolithic Rails Delivery Logic App Company Controller Contact Lead Invitation Contact Demographic Status Enrollment Degree LeadProcess Level Controller Lead Study Program Company Area Referral Leads School Delivery Controller Budget Client Search Programs Campus Budget Budget Controller Reports Caps Caps Search Controller Result Campus Location Campus Schools Budgets Locations Controller Controller Controller Saturday, March 19, 2011
  • 40. Legacy Tests As Behavior Scaffolding Saturday, March 19, 2011
  • 41. 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
  • 42. describe Contact do describe "#validate" do it "requires 10 digit phone numbers" do Phone ... 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
  • 43. 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 ... Zip 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
  • 44. 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 ... Email end it "rejects blank emails" do ... end it "rejects emails with bad words" do ... end ... end Saturday, March 19, 2011
  • 45. 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 ... end end 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
  • 46. 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
  • 47. 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
  • 48. 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
  • 49. 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
  • 50. 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
  • 52. Monolithic Rails App Lead Qualification Saturday, March 19, 2011
  • 53. Monolithic Rails App Lead Lead Qualification Delivery Saturday, March 19, 2011
  • 55. Qualification Service Factory Scrubber Scrubbing DSL Conditions Operands Scrubbing Engine Parameterized Zip Phone Email Rule Saturday, March 19, 2011
  • 56. Delivery Service Field Mapper Lead Formatter Phone Date Case Truncate Get/Post Email FTP/SFTP Custom Lead Deliverer Response Handler Get/Post Email FTP/SFTP Custom Saturday, March 19, 2011
  • 58. Monolithic Rails App Company Controller Contact Lead Invitation Contact Demographic Status Enrollment Degree LeadProcess Level Controller Lead Study Program Company Area Referral Leads School Delivery Controller Budget Client Search Programs Campus Budget Budget Controller Reports Caps Caps Search Controller Result Campus Location Campus Schools Budgets Locations Controller Controller Controller Saturday, March 19, 2011
  • 60. Client 1 Monolithic Rails App Saturday, March 19, 2011
  • 61. Client 1 Monolithic Rails App Client 2 Saturday, March 19, 2011
  • 62. Client 1 Monolithic Rails App Client 2 Client 3 Saturday, March 19, 2011
  • 63. Client 1 Monolithic Rails App Lead Delivery Client 2 Client 3 Saturday, March 19, 2011
  • 64. Lead Client 1 Monolithic Rails Delivery App Lead Client 2 Delivery Lead Client 3 Delivery Saturday, March 19, 2011
  • 65. Lead Client 1 Monolithic Rails Delivery App Lead 200 ms Client 2 Delivery Lead Client 3 Delivery Saturday, March 19, 2011
  • 66. Lead Client 1 Monolithic Rails Delivery App Lead 200 ms Client 2 Delivery Lead 4000 ms Client 3 Delivery Saturday, March 19, 2011
  • 67. Lead 10000 ms Client 1 Monolithic Rails Delivery App Lead 200 ms Client 2 Delivery Lead 4000 ms Client 3 Delivery Saturday, March 19, 2011
  • 68. 3. Make Incremental Changes Saturday, March 19, 2011
  • 69. Client 1 Monolithic Rails App Lead Delivery Client 2 Client 3 Saturday, March 19, 2011
  • 70. Monolithic Rails Client 1 App Client 1 Router Lead Client 2 Delivery Client 3 Saturday, March 19, 2011
  • 71. Monolithic Rails Client 1 App Client 1 Router Lead Client 2 Delivery Client 3 Saturday, March 19, 2011
  • 72. 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
  • 73. 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
  • 74. 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
  • 75. 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
  • 76. 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
  • 77. Monolithic Rails Client 1 App Client 1 Router Lead Client 2 Delivery Client 3 Saturday, March 19, 2011
  • 78. Client 1 Monolithic Rails App Lead Legacy Delivery Code Delivery Client 2 Client 3 Saturday, March 19, 2011
  • 79. What Did We Gain? Saturday, March 19, 2011
  • 84. Lead Lead Source Qualification Delivery Saturday, March 19, 2011
  • 85. Lead Lead Lead Source Qualification Assignment Delivery Saturday, March 19, 2011
  • 86. Lead Lead Call Source Qualification Delivery Center Call Lead Delivery Client Center Saturday, March 19, 2011
  • 87. Lead Lead Assignment Delivery Lead Lead Qualification Delivery Lead Call Lead Delivery Delivery Client Center Saturday, March 19, 2011
  • 88. Education Employment Lead Lead Qualification Delivery Loan Financing Saturday, March 19, 2011
  • 89. Lead Lead Email Lead Qualification Delivery Remarketing Conversion RabbitMQ Reporting Budget Admin Service Saturday, March 19, 2011
  • 90. { 'event':'delivery', 'status':'accepted', 'lead_id':'1234', 'timestamp':'2011-02-23 08:09:01', 'lead_details':{ ... } } Saturday, March 19, 2011
  • 91. Lead Lead Email Lead Qualification Delivery Remarketing Conversion RabbitMQ Reporting Budget Admin Service Saturday, March 19, 2011
  • 92. Lead Lead Email Lead Qualification Delivery Remarketing Conversion RabbitMQ Reporting Budget Admin Service Saturday, March 19, 2011
  • 93. Lead Lead Email Lead Qualification Delivery Remarketing Conversion RabbitMQ Reporting Budget Admin Service Saturday, March 19, 2011
  • 94. Lead Lead Email Lead Qualification Delivery Remarketing Conversion RabbitMQ Reporting Budget Admin Service Saturday, March 19, 2011
  • 95. What Did We Risk? Saturday, March 19, 2011
  • 98. Overly Decomposed Services Combat over-decomposition by consolidating code w/o necessarily isolating it as a ser vice 1) gems 2) local CouchDB stores that sync w/ a master store Saturday, March 19, 2011
  • 99. Lead Lead Email Qualification Delivery Remarketing Survey Engine Field Rules Formatting Engine Saturday, March 19, 2011
  • 100. Lead Lead Email Qualification Delivery Remarketing Survey Engine Field Rules Formatting Engine Saturday, March 19, 2011
  • 101. Lead Lead Email Qualification Delivery Remarketing Survey Engine Field Rules Formatting Engine Saturday, March 19, 2011
  • 102. Lead Lead Email Qualification Delivery Remarketing Survey Engine Field Rules Formatting Engine Saturday, March 19, 2011
  • 103. Lead Lead Email Qualification Delivery Remarketing Survey Engine Field Rules Formatting Engine Saturday, March 19, 2011
  • 104. Lead Lead Email Qualification Delivery Remarketing Survey Engine Saturday, March 19, 2011
  • 105. Lead Delivery Saturday, March 19, 2011
  • 106. Lead Lead Email Qualification Delivery Remarketing Survey Engine Saturday, March 19, 2011
  • 109. 1) http://www.vanderburg.org/Blog/Software/Development/ cohesion.rdoc 2) http://www.martinfowler.com/blikiStranglerApplication.html 3) http://www.eaipatterns.com/docs/EDA.pdf Saturday, March 19, 2011
  • 111. Thank You. Questions? Saturday, March 19, 2011