SlideShare a Scribd company logo
1 of 111
Download to read offline
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

(SDD407) Amazon DynamoDB: Data Modeling and Scaling Best Practices | AWS re:I...
(SDD407) Amazon DynamoDB: Data Modeling and Scaling Best Practices | AWS re:I...(SDD407) Amazon DynamoDB: Data Modeling and Scaling Best Practices | AWS re:I...
(SDD407) Amazon DynamoDB: Data Modeling and Scaling Best Practices | AWS re:I...Amazon Web Services
 
Building a Modern Microservices Architecture at Gilt: The Essentials
Building a Modern Microservices Architecture at Gilt: The EssentialsBuilding a Modern Microservices Architecture at Gilt: The Essentials
Building a Modern Microservices Architecture at Gilt: The EssentialsC4Media
 
How I learned to stop worrying and love the cloud
How I learned to stop worrying and love the cloudHow I learned to stop worrying and love the cloud
How I learned to stop worrying and love the cloudShlomo Swidler
 
Choosing the Right Framework for Running Docker Containers in Prod
Choosing the Right Framework for Running Docker Containers in ProdChoosing the Right Framework for Running Docker Containers in Prod
Choosing the Right Framework for Running Docker Containers in ProdJosh Padnick
 
Microservices at Spotify
Microservices at SpotifyMicroservices at Spotify
Microservices at SpotifyKevin Goldsmith
 
Micro Service Architecture
Micro Service ArchitectureMicro Service Architecture
Micro Service ArchitectureEduards Sizovs
 

Viewers also liked (9)

Under the Covers of DynamoDB
Under the Covers of DynamoDBUnder the Covers of DynamoDB
Under the Covers of DynamoDB
 
(SDD407) Amazon DynamoDB: Data Modeling and Scaling Best Practices | AWS re:I...
(SDD407) Amazon DynamoDB: Data Modeling and Scaling Best Practices | AWS re:I...(SDD407) Amazon DynamoDB: Data Modeling and Scaling Best Practices | AWS re:I...
(SDD407) Amazon DynamoDB: Data Modeling and Scaling Best Practices | AWS re:I...
 
Building a Modern Microservices Architecture at Gilt: The Essentials
Building a Modern Microservices Architecture at Gilt: The EssentialsBuilding a Modern Microservices Architecture at Gilt: The Essentials
Building a Modern Microservices Architecture at Gilt: The Essentials
 
How I learned to stop worrying and love the cloud
How I learned to stop worrying and love the cloudHow I learned to stop worrying and love the cloud
How I learned to stop worrying and love the cloud
 
Spotify: Data center & Backend buildout
Spotify: Data center & Backend buildoutSpotify: Data center & Backend buildout
Spotify: Data center & Backend buildout
 
Choosing the Right Framework for Running Docker Containers in Prod
Choosing the Right Framework for Running Docker Containers in ProdChoosing the Right Framework for Running Docker Containers in Prod
Choosing the Right Framework for Running Docker Containers in Prod
 
Zuul @ Netflix SpringOne Platform
Zuul @ Netflix SpringOne PlatformZuul @ Netflix SpringOne Platform
Zuul @ Netflix SpringOne Platform
 
Microservices at Spotify
Microservices at SpotifyMicroservices at Spotify
Microservices at Spotify
 
Micro Service Architecture
Micro Service ArchitectureMicro Service Architecture
Micro Service Architecture
 

Similar to Refactoring a Monolithic Rails App to a SOA

Customer Experience Management: Optimize your site to deliver a highly engagi...
Customer Experience Management: Optimize your site to deliver a highly engagi...Customer Experience Management: Optimize your site to deliver a highly engagi...
Customer Experience Management: Optimize your site to deliver a highly engagi...Janet Jaiswal
 
]project-open[ Data-Model 100511b
]project-open[ Data-Model 100511b]project-open[ Data-Model 100511b
]project-open[ Data-Model 100511bKlaus Hofeditz
 
Acl Presentation 3 4 10 Final
Acl Presentation 3 4 10 FinalAcl Presentation 3 4 10 Final
Acl Presentation 3 4 10 Finalmcoello
 
M2M Billing - Comarch M2M Projects
M2M Billing - Comarch M2M ProjectsM2M Billing - Comarch M2M Projects
M2M Billing - Comarch M2M ProjectsComarch
 
Comarch Technology Review Magazine 2011/01
Comarch Technology Review Magazine 2011/01Comarch Technology Review Magazine 2011/01
Comarch Technology Review Magazine 2011/01Comarch
 
Conversion conference london nov 2011 - multi channel testing - craig sullivan
Conversion conference london   nov 2011 - multi channel testing - craig sullivanConversion conference london   nov 2011 - multi channel testing - craig sullivan
Conversion conference london nov 2011 - multi channel testing - craig sullivanCraig Sullivan
 
PayPal Behavioral Analytics on Hadoop
PayPal Behavioral Analytics on HadoopPayPal Behavioral Analytics on Hadoop
PayPal Behavioral Analytics on HadoopDataWorks Summit
 
Ibm Cio 2010 Outlook Roo Reynolds 1195844599287728 4
Ibm Cio 2010 Outlook Roo Reynolds 1195844599287728 4Ibm Cio 2010 Outlook Roo Reynolds 1195844599287728 4
Ibm Cio 2010 Outlook Roo Reynolds 1195844599287728 4adrian7091
 
Londens Business Presentation
Londens Business PresentationLondens Business Presentation
Londens Business PresentationShehryar Naqvi
 
Londens presentation 2
Londens presentation 2Londens presentation 2
Londens presentation 2Shehryar Naqvi
 
IT Strategy : Communication & Challenges
IT Strategy : Communication & ChallengesIT Strategy : Communication & Challenges
IT Strategy : Communication & Challengeshblowers
 
Conversion Conference - What's in YOUR toolkit?
Conversion Conference - What's in YOUR toolkit?Conversion Conference - What's in YOUR toolkit?
Conversion Conference - What's in YOUR toolkit?Craig Sullivan
 
Market Research Report : E-Commerce India 2011
Market Research Report :   E-Commerce India 2011Market Research Report :   E-Commerce India 2011
Market Research Report : E-Commerce India 2011Netscribes, Inc.
 

Similar to Refactoring a Monolithic Rails App to a SOA (20)

Hacking Trust
Hacking TrustHacking Trust
Hacking Trust
 
Customer Experience Management: Optimize your site to deliver a highly engagi...
Customer Experience Management: Optimize your site to deliver a highly engagi...Customer Experience Management: Optimize your site to deliver a highly engagi...
Customer Experience Management: Optimize your site to deliver a highly engagi...
 
]project-open[ Data-Model 100511b
]project-open[ Data-Model 100511b]project-open[ Data-Model 100511b
]project-open[ Data-Model 100511b
 
Lodestone Gaining More From Your Erp
Lodestone Gaining More From Your ErpLodestone Gaining More From Your Erp
Lodestone Gaining More From Your Erp
 
Acl Presentation 3 4 10 Final
Acl Presentation 3 4 10 FinalAcl Presentation 3 4 10 Final
Acl Presentation 3 4 10 Final
 
M2M Billing - Comarch M2M Projects
M2M Billing - Comarch M2M ProjectsM2M Billing - Comarch M2M Projects
M2M Billing - Comarch M2M Projects
 
Ibm Cio 2010 Outlook
Ibm Cio 2010 OutlookIbm Cio 2010 Outlook
Ibm Cio 2010 Outlook
 
Comarch Technology Review Magazine 2011/01
Comarch Technology Review Magazine 2011/01Comarch Technology Review Magazine 2011/01
Comarch Technology Review Magazine 2011/01
 
Conversion conference london nov 2011 - multi channel testing - craig sullivan
Conversion conference london   nov 2011 - multi channel testing - craig sullivanConversion conference london   nov 2011 - multi channel testing - craig sullivan
Conversion conference london nov 2011 - multi channel testing - craig sullivan
 
PayPal Behavioral Analytics on Hadoop
PayPal Behavioral Analytics on HadoopPayPal Behavioral Analytics on Hadoop
PayPal Behavioral Analytics on Hadoop
 
Electronic Business
Electronic BusinessElectronic Business
Electronic Business
 
Electronic Business
Electronic BusinessElectronic Business
Electronic Business
 
eBusiness
eBusinesseBusiness
eBusiness
 
Ibm Cio 2010 Outlook Roo Reynolds 1195844599287728 4
Ibm Cio 2010 Outlook Roo Reynolds 1195844599287728 4Ibm Cio 2010 Outlook Roo Reynolds 1195844599287728 4
Ibm Cio 2010 Outlook Roo Reynolds 1195844599287728 4
 
Framework4Localization in Action
Framework4Localization in ActionFramework4Localization in Action
Framework4Localization in Action
 
Londens Business Presentation
Londens Business PresentationLondens Business Presentation
Londens Business Presentation
 
Londens presentation 2
Londens presentation 2Londens presentation 2
Londens presentation 2
 
IT Strategy : Communication & Challenges
IT Strategy : Communication & ChallengesIT Strategy : Communication & Challenges
IT Strategy : Communication & Challenges
 
Conversion Conference - What's in YOUR toolkit?
Conversion Conference - What's in YOUR toolkit?Conversion Conference - What's in YOUR toolkit?
Conversion Conference - What's in YOUR toolkit?
 
Market Research Report : E-Commerce India 2011
Market Research Report :   E-Commerce India 2011Market Research Report :   E-Commerce India 2011
Market Research Report : E-Commerce India 2011
 

Recently uploaded

08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxOnBoard
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 

Recently uploaded (20)

08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptx
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 

Refactoring a 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 cbwyckoff@gmail.com @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 => "foo@yahoo.com", :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 => "foo@yahoo.com", :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 => "foo@yahoo.com", :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 => "foo@yahoo.com", :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