Confidential – for information of designated recipient only. Copyright Terracotta 2006 Cluster...
-
Upload
deborah-gibbs -
Category
Documents
-
view
213 -
download
0
Transcript of Confidential – for information of designated recipient only. Copyright Terracotta 2006 Cluster...
Confidential – for information of designated recipient only. Copyright Terracotta 2006
Cluster Your JVM to SIMPLIFY application architecture
Terracotta, Inc.
Confidential – for information of designated recipient only. Copyright Terracotta 2006
Goal of This Session
Learn how TRANSPARENT CLUSTERING works at a high level
An in-depth look at clustering inside OSS stack
Confidential – for information of designated recipient only. Copyright Terracotta 2006
Demo
Shared Drawing Editor
Since a picture is worth a thousand words…
Confidential – for information of designated recipient only. Copyright Terracotta 2006
Agenda
Why Runtime Clustering
How Runtime Clustering Works
Our Implementation: Terracotta Architecture
Use what you need: OSS on Terracotta
Confidential – for information of designated recipient only. Copyright Terracotta 2006
Programming Should Be Fun
The moment of joy:• That’s awesome• I made that happen• Ergo, I’m awesome
• Java used to be fun• Object oriented, built-in GUI, threading,
networking, GC, and a VM• Lets you do awesome stuff
Confidential – for information of designated recipient only. Copyright Terracotta 2006
Inevitably, the Real World Intrudes
High-availability & scalability => scale-out
– Scale-out forces externalized object state: stateless programming model
– Alphabet soup of infrastructure development frameworks creep in
» EJB, JMS, JDBC, SOAP, O/R… Ugh. That’s not awesome.
Confidential – for information of designated recipient only. Copyright Terracotta 2006
Impact of API-based Clustering
Scale-out solutions rely on Java Serialization
This breaks object identity– Data put into the cache and then read back will fail:– (obj == obj) false
Perturbs the Domain Model – Management of object references using primary keys– "Fake POJOs"
Adds new coding rules– Need to put() changes back - easy to forget– Can’t trust callers outside the caching class to put a top-level object back in
the cache if they edited it
This is not as simple as the Java language can be
Confidential – for information of designated recipient only. Copyright Terracotta 2006
Managed Runtimes to the Rescue
Example: Memory Management– Remember malloc() and free(), heap vs. stack– The JVM introduced most developers to garbage collection, but compile-time
used to win– Today, the JVM is faster; it decides what do do at runtime instead of at
compile time» More information available at runtime » “…only 12 times faster than C means you haven't started optimizing” – Doug Lea
Other Java features that make Developers’ lives easier:– Platform-independent thread coordination / locking– Fat / thin locks in Jrockit decided at runtime– Platform specific optimizations
Confidential – for information of designated recipient only. Copyright Terracotta 2006
Clustering at Runtime…Stateful Applications: Code Like Your Mom Used to Make
TC lets you cluster Java in a natural fashion– No Serialization– No API No “cluster-aware” code creeping in
The runtime can do it better than you
Byte Code Instrumentation– GETFIELD– PUTFIELD– MONITORENTER;– MONITOREXIT;– Object.wait()– Object.notify()
Confidential – for information of designated recipient only. Copyright Terracotta 2006
Terracotta Architecture: Cluster w/o JEE Resources
Capabilities
Heap Level Replication - share almost any object graph
ACID Replication - no new exceptions or error scenarios
Central storage - keeps app state across restarts
Comm. Hub - manage shared object comms w/o multicast or split brain
Virtual Memory - page in objects on demand
Coordination - We have extended our support to wait / notify and other useful tools
Scale-out
App Server
Web App
JVM DSO Libraries
SharedObjects
Terracotta ServerClustering the JVM
Terracotta ServerClustering the JVM
App Server
Web App
JVM DSO Libraries
SharedObjects
App Server
Web App
JVM DSO Libraries
SharedObjects
Confidential – for information of designated recipient only. Copyright Terracotta 2006
Common Use-cases
HTTP Session clustering for HA + scalability– Add-a-server capacity– Efficient replication: no serialization, write only deltas and only where needed– no need to tear objects apart into session attributes– no "put-back"-- nothing to remember (and get wrong) at dev time– No zipper-effect from very large sessions
Clustered caches• Write and update cache once, not N-times• Eliminate the 1/N effect• Choose an existing cache implementation or use your own, Terracotta clusters underneath
• Clustered POJOs
• Clustered Spring
• Collaboration / Coordination / Eventing
• Distributed work management
• Shared Memory / Large Virtual Memory
• Fundamentally open-ended• Wherever thread communication across JVMs and an unlimited, efficiently replicated heap is useful
Confidential – for information of designated recipient only. Copyright Terracotta 2006
DEMO 2
Geronimo HTTP Session Clustering
Shared JTable (spreadsheet) Inside Geronimo
Confidential – for information of designated recipient only. Copyright Terracotta 2006
package demo.jtable;import javax.swing.JFrame;import javax.swing.JScrollPane;import javax.swing.JTable;import javax.swing.table.DefaultTableModel;
class TableDemo extends JFrame {
// Shared object private DefaultTableModel model;
private static Object[][] tableData = { { " 9:00", "", "", ""}, { "10:00", "", "", ""}, { "11:00", "", "", ""}, { "12:00", "", "", ""}, { " 1:00", "", "", ""}, { " 2:00", "", "", ""}, { " 3:00", "", "", ""}, { " 4:00", "", "", ""}, { " 5:00", "", "", ""} }; TableDemo() { super("Table Demo"); setSize(350, 220); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Object[] header = {"Time", "Room A", "Room B", "Room C"}; model = new DefaultTableModel(tableData, header); JTable schedule = new JTable(model); getContentPane().add(new JScrollPane(schedule), java.awt.BorderLayout.CENTER); } public static void main(String[] args) { new TableDemo().setVisible(true); }}
Entire Swing Application
Confidential – for information of designated recipient only. Copyright Terracotta 2006
package demo.jtable;
import javax.swing.table.DefaultTableModel;
public class Roots { // shared root private static final DefaultTableModel model; // … initialization public static DefaultTableModel getModel() { return model; }}
Web Application: Root Declaration
Confidential – for information of designated recipient only. Copyright Terracotta 2006
Web Application: Table Rendering
public class Table { private final DefaultTableModel model; // … initialization public String toString() { StringBuffer buf = new StringBuffer(); Vector<Vector<String>> dataVector = this.model.getDataVector(); buf.append("<table border=\"" + this.border + "\">\n");
synchronized (dataVector) { buf.append(" <tr>\n"); for (int i = 0; i < this.model.getColumnCount(); i++) { buf.append(" <th>").append(this.model.getColumnName(i)).append("</th>\n"); } buf.append(" </tr>\n");
for (Iterator<Vector<String>> i = dataVector.iterator(); i.hasNext();) { buf.append(" <tr>\n"); Vector<String> data = i.next(); for (Iterator<String> j = data.iterator(); j.hasNext();) { buf.append(" <td>"); buf.append(j.next()); buf.append("</td>\n"); } buf.append(" </tr>\n"); } }
buf.append("</table>"); return buf.toString(); }}
Confidential – for information of designated recipient only. Copyright Terracotta 2006
<%@ page language="java" import="demo.jtable.Roots" pageEncoding="ISO-8859-1"%><%@ page language="java" import="demo.jtable.web.Table"%>
<html> <head> <title>Open Terracotta JTable</title> </head> <body>
<h1>JTable</h1><%
Table table = new Table(Roots.getModel());table.setBorder(1);
%> <%=table%> </body></html>
Web Application: JSP
Confidential – for information of designated recipient only. Copyright Terracotta 2006
<terracotta-config> <dso> <server-host>localhost</server-host> <server-port>9510</server-port> <dso-client>
<roots> <root> <field-name>demo.jtable.Main.model</field-name>
<root-name>demo_jtable_model</root-name> </root>
<root> <field-name>demo.jtable.Roots.model</field-name> <root-name>demo_jtable_model</root-name> </root>
</roots>
<included-classes> <include><class-expression>demo..*</class-expression></include> </included-classes> <web-applications> <web-application>Cart</web-application> </web-applications>
</dso-client> </dso>
</terracotta-config>
Configuration File
Confidential – for information of designated recipient only. Copyright Terracotta 2006
Stateful Model in a Stateless World
Hub and Spoke as a SPOF?
Field-level changes too chatty?
Networking overhead to clustering?
Confidential – for information of designated recipient only. Copyright Terracotta 2006
Stateful Model in a Stateless World
Hub and Spoke scale the hub
Field-level changes batched
Network overhead runtime optimized
Confidential – for information of designated recipient only. Copyright Terracotta 2006
Stateful Model in a Stateless World
Simple programming model– Clustered code looks, acts, and smells like regular Java– Testable
Scale-out: high-availability AND scalability
Jettison the traditional trade-offs between simplicity, reliability, and scalability
The power of Terracotta makes programming fun-- increases the frequency of moments of joy
Confidential – for information of designated recipient only. Copyright Terracotta 2006
Learn more…
http://www.terracotta.org/
http://blog.terracottatech.com/
http://apache.geronimo.com/
Confidential – for information of designated recipient only. Copyright Terracotta 2006
Summary
Infrastructure services are the responsibility of the Runtime, not the developer
New API’s and developer frameworks are not the answer
Technology exists to cluster and cache transparently today
Terracotta works in Geronimo (beta), Tomcat, Weblogic, JBoss (beta), WebsphereCE (beta), and standalone Java apps
Coming soon: Jetty (by JavaOne), Glassfish, Websphere
Scale lightweight stacks: Spring, iBATIS, RIFE, Wicket, Struts, OSCache, Ehcache...