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

Micro Service Architecture
Micro Service ArchitectureMicro Service Architecture
Micro Service Architecture
Eduards 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 Refactor Your Monolithic Rails App to a SOA

Acl Presentation 3 4 10 Final
Acl Presentation 3 4 10 FinalAcl Presentation 3 4 10 Final
Acl Presentation 3 4 10 Final
mcoello
 
M2M Billing - Comarch M2M Projects
M2M Billing - Comarch M2M ProjectsM2M Billing - Comarch M2M Projects
M2M Billing - Comarch M2M Projects
Comarch
 
PayPal Behavioral Analytics on Hadoop
PayPal Behavioral Analytics on HadoopPayPal Behavioral Analytics on Hadoop
PayPal Behavioral Analytics on Hadoop
DataWorks 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 4
adrian7091
 
Londens Business Presentation
Londens Business PresentationLondens Business Presentation
Londens Business Presentation
Shehryar Naqvi
 
Londens presentation 2
Londens presentation 2Londens presentation 2
Londens presentation 2
Shehryar Naqvi
 
IT Strategy : Communication & Challenges
IT Strategy : Communication & ChallengesIT Strategy : Communication & Challenges
IT Strategy : Communication & Challenges
hblowers
 
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
Netscribes, Inc.
 

Similar to Refactor Your 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

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 

Recently uploaded (20)

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...
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu SubbuApidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
A Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source MilvusA Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source Milvus
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 

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 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