Designing Large-Scale Applications in Python



Similar documents
Developing large-scale Applications in Python

Base One's Rich Client Architecture

Dynamic Web Programming BUILDING WEB APPLICATIONS USING ASP.NET, AJAX AND JAVASCRIPT

HOSTING PYTHON WEB APPLICATIONS. Graham Dumpleton PyCon Australia Sydney 2011

Enterprise Application Monitoring with

Stop being Rails developer

Son of SOA Resource-Oriented Computing Event-Driven Architecture

Improving database development. Recommendations for solving development problems using Red Gate tools

CISC 275: Introduction to Software Engineering. Lab 5: Introduction to Revision Control with. Charlie Greenbacker University of Delaware Fall 2011

WHITEPAPER. Improving database development

Building Applications Using Micro Focus COBOL

zen Platform technical white paper

About this document. The technical fundamentals

Scalable Web Programming. CS193S - Jan Jannink - 1/12/10

Qint Software - Technical White Paper

PHP on IBM i: What s New with Zend Server 5 for IBM i

Glassfish, JAVA EE, Servlets, JSP, EJB

MA-WA1920: Enterprise iphone and ipad Programming

ZooKeeper. Table of contents

mod_tcl TCL inside the Apache web server

MS 20487A Developing Windows Azure and Web Services

Building Java Servlets with Oracle JDeveloper

Introducing Apache Pivot. Greg Brown, Todd Volkert 6/10/2010

Objectives. Chapter 2: Operating-System Structures. Operating System Services (Cont.) Operating System Services. Operating System Services (Cont.

Parallel Databases. Parallel Architectures. Parallelism Terminology 1/4/2015. Increase performance by performing operations in parallel

This module provides an overview of service and cloud technologies using the Microsoft.NET Framework and the Windows Azure cloud.

ios Cloud Development FOR Neal Goldstein WILEY John Wiley & Sons, Inc.

Why Threads Are A Bad Idea (for most purposes)

socketio Documentation

Programming in C# with Microsoft Visual Studio 2010

MOC DEVELOPING WINDOWS AZURE AND WEB SERVICES

The Automatic HTTP Requests Logging and Replaying Subsystem for CMS Plone

How To Write A Windows Operating System (Windows) (For Linux) (Windows 2) (Programming) (Operating System) (Permanent) (Powerbook) (Unix) (Amd64) (Win2) (X

Good FORTRAN Programs

Operating System Structures

Review from last time. CS 537 Lecture 3 OS Structure. OS structure. What you should learn from this lecture

Nginx 1 Web Server Implementation

ConCERTO Secure Solutions for Converged Systems

Integrity Checking and Monitoring of Files on the CASTOR Disk Servers

IHS USER SECURITY AUDIT

Service Oriented Architecture

Pitfalls and Best Practices in Role Engineering

WEB APPLICATION DEVELOPMENT. UNIT I J2EE Platform 9

Service Oriented Architectures


Secure Web Appliance. Reverse Proxy

HP Operations Orchestration Software

Liferay Portal User Guide. Joseph Shum Alexander Chow

PageScope Enterprise Suite 3.0

Internet Information TE Services 5.0. Training Division, NIC New Delhi

September 18, Modular development in Magento 2. Igor Miniailo Magento

Test Run Analysis Interpretation (AI) Made Easy with OpenLoad

Web4thejob. About Web4thejob. ZK x Web4thejob

General principles and architecture of Adlib and Adlib API. Petra Otten Manager Customer Support

Introduction to Embedded Systems. Software Update Problem

Getting started with API testing

11. Oracle Recovery Manager Overview and Configuration.

Internet Engineering: Web Application Architecture. Ali Kamandi Sharif University of Technology Fall 2007

Ruby on Rails. a high-productivity web application framework. blog.curthibbs.us/ Curt Hibbs <curt@hibbs.com>

Monitoring Infrastructure for Superclusters: Experiences at MareNostrum

ProxySG TechBrief Implementing a Reverse Proxy

Service-Oriented Architecture and Software Engineering

WebSphere ESB Best Practices

Trend Micro Incorporated reserves the right to make changes to this document and to the products described herein without notice.

Anwendungsintegration und Workflows mit UNICORE 6

EWD: Simplifying Web Application Architecture

Information Systems Analysis and Design CSC John Mylopoulos. Software Architectures Information Systems Analysis and Design CSC340

Easy Wireframing with

Introducing ZENworks 11 SP4. Experience Added Value and Improved Capabilities. Article. Article Reprint. Endpoint Management

Developing Applications With The Web Server Gateway Interface. James Gardner EuroPython 3 rd July

Course Syllabus: RIA Programming for Magic xpa 2.x Developers

BusinessObjects Enterprise XI Release 2 Administrator s Guide

This course provides students with the knowledge and skills to develop ASP.NET MVC 4 web applications.

Understanding Evolution's Architecture A Technical Overview

Accelerating Zope applications with Squid and ESI

How to use PDFlib products with PHP

JMETER - MONITOR TEST PLAN

Course Syllabus: RIA Programming for unipaas V1.x Developers

Desktop, Web and Mobile Testing Tutorials

Using Metadata Manager for System Impact Analysis in Healthcare

IHS Emergency Department Dashboard


Software Automated Testing

SCALABILITY AND AVAILABILITY

CHAPTER - 5 CONCLUSIONS / IMP. FINDINGS

Abstract. Description

Software design (Cont.)

Version 2.3. Administration SC

ORACLE OLAP. Oracle OLAP is embedded in the Oracle Database kernel and runs in the same database process

NEOAUG. Custom Web ADI Integrators

Pro<DOC/> e-commerce Technology An Introduction

Automate Your Deployment with Bamboo, Drush and Features DrupalCamp Scotland, 9 th 10 th May 2014

Product Overview & New Features

A Tool for Evaluation and Optimization of Web Application Performance

Testing New Applications In The DMZ Using VMware ESX. Ivan Dell Era Software Engineer IBM

What is Data Virtualization?

AQA GCSE in Computer Science Computer Science Microsoft IT Academy Mapping

GUI Test Automation How-To Tips

Copyrighted , Address :- EH1-Infotech, SCF 69, Top Floor, Phase 3B-2, Sector 60, Mohali (Chandigarh),

Continuous Delivery and Test Automation in Agile SW projects with Robot Framework Antti Pohjonen

Transcription:

Designing Large-Scale Applications in Python Lessons learned in more than 10 years of Python Application Design EuroPython Conference 2008 Vilnius, Lithuania Marc-André Lemburg EGENIX.COM Software GmbH Germany

Speaker Introduction: Marc-André Lemburg CEO egenix.com and Consultant Designing Large-Scale Applications More than 20 years software development experience Diploma in Mathematics Expert in Python, Application Design, Web Technologies and Unicode Python Core Developer (since 2000) Python Software Foundation Board Member (2002-2004) Contact: mal@egenix.com egenix.com Software GmbH, Germany Founded in 2000 Core business: Consulting: helping companies write successful Python software Product design: professional quality Python/Zope developer tools (mxodbc, mxdatetime, mxtexttools, etc.) International customer base 2

Agenda 1. Introduction 2. Application Design 3. Before you start 4. Discussion 3

Introduction 1. Introduction 2. Application Design 3. Before you start 4. Discussion 4

Designing Python Applications Python makes it very easy to write complex applications with very little code It s easy to create bad designs fast Rewriting code is fast as well Application design becomes the most important factor in Python projects This talk presents a general approach to the problem which is not necessarily specific to Python 5

Large-scale applications What can be considered large-scale in Python? Server application: >100 thousand lines of Python code Client application: >50 thousand lines of Python code Third-Party code: > 10 thousand lines of code Typically a mix of Python code and C extensions Examples: Zope / Plone egenix Application Server egenix projects: e.g. Web Service Engine, XML Database, ASP Trading System 6

Why write large-scale applications in Python? Highly efficient small teams can scale up against large companies very competitive turn-around times small investments can result in high gains Very flexible Designing Large-Scale Applications allows rapid design, refactoring and rollout highly adaptive to new requirements and environments no lock-in Time-to-market develop in weeks rather than months 7

Application Design 1. Introduction 2. Application Design 3. Before you start 4. Discussion 8

The Design Concept: Structured Structured approach to application design Divide et Impera (divide and conquer) Designing Large-Scale Applications Top-down method: 1. Application model 2. Processing model 3. Layer model 4. Components 5. Management objects 6. Data and Task objects Lots of experience also helps 9

The Design Concept: or using import this Zen of Application Design Designing Large-Scale Applications Keep things as simple as possible, but not simpler (KISS). Before doing things twice, think twice (DRY). If things start to get too complex, management is needed. If management doesn t help, decomposition is needed. Keep in mind: There s beauty in design. 10

Divide et Impera: Step by step approach Designing Large-Scale Applications Goal: Break down complexity as far as possible! Top-down method: 1. Application model 2. Processing model 3. Layer model 4. Components 5. Management objects 6. Data and Task objects 11

Divide et Impera: Start with the type of application Goal: Break down complexity as far as possible! Top-down method: 1. Application model 2. Processing model 3. Layer model 4. Components 5. Management objects 6. Data and Task objects 12

Choose a suitable application model Designing Large-Scale Applications Client-Server Client application / Server application Web client / Server application Multi-threaded stand-alone Stand-alone GUI application Single process GUI Client Server Event Handler Business Logic etc. Command-line application Batch job application Input Processor Output 13

Divide et Impera: How should requests be processed? Goal: Break down complexity as far as possible! Top-down method: 1. Application model 2. Processing model 3. Layer model 4. Components 5. Management objects 6. Data and Task objects 14

Identify the processing model Identify the processing scheme: Single process Multiple processes Multiple threads Asynchronous processing A mix of the above Task 1 Interface Logic Task 2 Server Logic Application Interface Logic Logic Task 3 Storage Server Logic Logic Application Interface Logic Logic Storage Server Logic Logic Application Logic Storage Logic 15

Identify the processing model Identify the process/thread boundaries: Which components (need to) share the same object space? Where is state kept? What defines an application instance? Application Interface Logic Server Logic Application Logic Storage Logic 16

Divide et Impera: Break down by functionality Designing Large-Scale Applications Goal: Break down complexity as far as possible! Top-down method: 1. Application model 2. Processing model 3. Layer model 4. Components 5. Management objects 6. Data and Task objects 17

Find the right layer model Every application can be divided into layers of functionality defined by the flow of data through the application Top layer: interface to the outside world Intermediate layers: administration and processing Application Interface Logic Server Logic Application Logic Storage Logic Bottom layer: data storage 18

Examples of layer models Client application: GUI / Application Logic / Storage Logic Web application: Web Browser/ Network / Apache / Interface Logic (CGI, SCGI, WSGI) / Server Logic / Application Logic / Storage Logic Batch processing: File I/O / Application Logic / Storage Logic Custom model Client Web Browser Server Interface Logic Server Logic Application Logic Storage Logic 19

Examples of layer models Client application: GUI / Application Logic / Storage Logic Web application: Web Browser/ Network / Apache / Interface Logic (CGI, SCGI, WSGI) / Server Logic / Application Logic / Storage Logic Batch processing: File I/O / Application Logic / Storage Logic Custom model Client Web Browser Server Interface Logic Server Logic Application Logic Storage Logic 20

Example: Web Client + Server Application Situation: Designing Large-Scale Applications Client is a standard web-browser Server needs to take a lot of load and will have to do all the calculation work Server needs to be fail-safe Server is connected to a database 21

Example: Web Client + Server Application Designing Large-Scale Applications Solution: Client Client Client Application model: client-server Processing model: multiple process model Layer model: typical application server layers Web Browser Server Process Interface Logic Server Logic Application Logic Storage Logic Web Browser Apache Web Server Multiple Process Broker SCGI Server Process Interface Logic Server Logic Application Logic Storage Logic Web Browser Server Process Interface Logic Server Logic Application Logic Storage Logic Database 22

Find the right layer model: ok, but now what? Layers are usually easy to identify, given the application model but often hard to design Application Interface Logic Server Logic Application Logic Storage Logic 23

Divide et Impera: Layers are still too complex Designing Large-Scale Applications Goal: Break down complexity as far as possible! Top-down approach: 1. Application model 2. Processing model 3. Layer model 4. Components 5. Management objects 6. Data and Task objects 24

Breaking layers into smaller pieces: Components Layers provide a data driven separation of functionality Problem: The level of complexity is usually too high to implement these in one piece of code Solution: build layers using a set of loosely coupled components 25

Component design Components should encapsulate higher level concepts within the application Components provide independent building blocks for the application 26

Component examples Components provide the database interface implement the user management implement the session management provide caching facilities interface to external data sources provide error handling facilities enable logging management etc. 27

Advantages of components: Easily replaceable Designing Large-Scale Applications They should be easily replaceable to adapt the application to new requirements, e.g. porting the application to a new database backend, using a new authentication mechanism, etc. If implemented correctly, they will even allow switching to a different processing model, should the need arise 28

Advantages of components: Loose coupling Designing Large-Scale Applications Loose coupling of the components makes it possible to refine the overall application design, refactor parts of the layer logic, or add new layers without having to rewrite large parts of the application code 29

Component implementation Each component is represented by a component object Component interfaces must be simple and high-level enough to allow for loose coupling Internal parts of the components are never accessed directly, only via the component interface Component objects should never keep state across requests Ideally, they should also be thread-safe 30

Layers and components: The big picture Designing Large-Scale Applications Process Boundary (Multiple Process Model) Interface Layer Application Instance Layer RequestComponent ResponseComponent SystemComponent Server Layer SessionComponent UserComponent Application Layer HandlerComponent ImportExportComponent Storage Layer PresentationComponent ValidationComponent ErrorComponent LogComponent DatabaseComponent FilesystemComponent DebugComponent 31

Layers and components: The big picture Designing Large-Scale Applications Process Boundary (Multiple Process Model) Interface Layer Application Instance Layer RequestComponent ResponseComponent SystemComponent Server Layer SessionComponent Application Layer HandlerComponent ImportExportComponent Storage Layer UserComponent PresentationComponent ValidationComponent ErrorComponent LogComponent All Component Objects are connected to the SystemComponent object DatabaseComponent FilesystemComponent DebugComponent 32

Special component: The System Object Designing Large-Scale Applications One system component object which represents the application instance All component objects are created and managed by the system object Components can access each other through the system object (circular references!) There can be multiple system objects, e.g. one running in each thread 33

Split layers into components: Summary Designing Large-Scale Applications General approach: Process Boundary (Multiple Process Model) Interface Layer Application Instance Layer One system component that manages the application instance RequestComponent Server Layer SessionComponent Application Layer HandlerComponent ResponseComponent UserComponent PresentationComponent SystemComponent ErrorComponent ImportExportComponent ValidationComponent At least one component per layer Storage Layer DatabaseComponent FilesystemComponent LogComponent DebugComponent 34

Divide et Impera: What if components are still too complex? Goal: Break down complexity as far as possible! Top-down approach: 1. Application model 2. Processing model 3. Layer model 4. Components 5. Management objects 6. Data and Task objects 35

Reduce component complexity: Management objects Management objects help simplify component object implementations work on or with groups of low-level data/task objects provide application internal APIs interface to the outside world, e.g. file system, database, GUI, etc. Note: The distinction between management objects and component objects is not always clear 36

Management object or component? Use component objects to represent logical units / concepts within the application without going into too much detail Use management objects to work on collections of data/task objects to simplify component implementations to avoid direct interfacing between the data/task objects Designing Large-Scale Applications Try to never mix responsibilities 37

Divide et Impera: The Lowest Level Designing Large-Scale Applications Goal: Break down complexity as far as possible! Top-down approach: 1. Application model 2. Processing model 3. Layer model 4. Components 5. Management objects 6. Data and Task objects 38

Lowest level: Data and task objects Data objects encapsulate data (nothing much new here) Designing Large-Scale Applications Task objects interaction with multiple objects I/O on collections of objects delegating work to other management objects interfacing to component objects etc. 39

Example: Internal Communication Designing Large-Scale Applications SystemComponent Application Layer HandlerComponent TaskManager Management Object Object Access Path PresentationComponent ValidationComponent Edit Store Export Data/Task Object ImportExportComponent ImportManager ExportManager CSVImport XMLImport XLSImport CSVExport XMLExport XLSExport 40

Special data object: Request Context Object This is useful for task based applications, e.g. web applications Data management: Components don t store per-request state! Per-request data is stored and passed around via Request Context Objects Designing Large-Scale Applications Process Boundary (Multiple Process Model) Interface Layer RequestComponent Server Layer SessionComponent Application Layer HandlerComponent ImportExportComponent Storage Layer DatabaseComponent ResponseComponent UserComponent Request Context Object PresentationComponent ValidationComponent FilesystemComponent Application Instance Layer SystemComponent ErrorComponent LogComponent DebugComponent 41

And don t forget: There s beauty in design! Designing Large-Scale Applications 42

Before you start... 1. Introduction 2. Application Design 3. Before you start 4. Discussion 43

Structuring your modules First some notes on the import statement: Keep import dependencies low; avoid from import * Always use absolute import paths (defeats pickle problems among other things) Always layout your application modules using Python packages Import loops can be nasty; import on demand can sometimes help 44

Finding the right package structure Designing Large-Scale Applications Group components and associated management modules in Python packages (directories) Use the application and layer model as basis for the package layout 45

Finding the right package structure Designing Large-Scale Applications Use one module per management/component class group of object classes managed by the same management class keep modules small; if in doubt, split at class boundaries 46

Data, classes and methods Use data objects for data encapsulation instead of simple types (tuples, lists, dictionaries, etc.) Namespace objects are one honking great idea do more of those 47

Data, classes and methods Use methods even for simple tasks but don t make them too simple Use method groups for more complex tasks e.g. to implement a storage query interface 48

Data, classes and methods Use mix-in classes if method groups can be deployed in more than class context If you need to write the same logic twice, think about creating a mix-in class to encapsulate it, or put it on a base class Avoid using mix-in classes, if only one class makes use of them 49

Make mistakes and learn from them: Refactoring If an implementation gets too complicated, sit down and reconsider the design often enough a small change in the way objects interact can do wonders Be daring when it comes to rewriting larger parts of code! It sometimes takes more than just a few changes to get a design right It is often faster to implement a good design from scratch, than trying to fix a broken one 50

Often forgotten: Documentation Always document the code that you write! Use doc-strings and inline comments doc-strings represent your method s contracts with the outside world Block logical units using empty lines Python loves whitespace 51

Often forgotten: Documentation Document the intent of the methods, classes and logical code units not only their interface Use descriptive identifier names even if they take longer to type 52

Quality Assurance: XP helps! Use extreme programming techniques whenever possible: Always read the code top to bottom after you have made changes or added something new to it Try to follow the flow of information in your mind (before actually running the code) Write unit tests for the code and/or test it until everything works as advertised in the doc-strings 53

Quality Assurance: A few additional tips Typos can easily go unnoticed in Python: use the editor s auto-completion function as often as possible Designing Large-Scale Applications Use tools like PyChecker to find hidden typos and possibly bugs Always test code before committing it to the software repository 54

Conclusion Structured application design can go a long way Divide-et-impera helps keep basic buildings blocks manageable Extreme programming doesn t have to spoil the fun 55

All this sounds familiar Application design is in many ways like structuring a company: Divisions need to be set up (component objects) Responsibilities need to be defined (management vs. data/task objects) Processes need to be defined (component/management object APIs) Applications work in many ways like companies: Customer interaction (user interface) Information flow (application interface) Decision process (business logic) Accounting and data keeping (storage interface) 56

Discussion 1. Introduction 2. Application Design 3. Before you start 4. Discussion 57

Developing large-scale applications in Python Designing Large-Scale Applications Questions? 58

And finally... Thank you for your time. 59

Contact egenix.com Software, Skills and Services GmbH Marc-André Lemburg Pastor-Löh-Str. 48 D-40764 Langenfeld Germany email: mal@egenix.com Phone: +49 211 9304112 Fax: +49 211 3005250 Web: http://www.egenix.com/ 60