Clustering the JVM

Download Report

Transcript Clustering the JVM

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
Since a picture is worth a thousand words…
Shared Drawing Editor
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
App Server
Web App
Web App
Shared
Objects
JVM
DSO Libraries
App Server
Web App
Shared
Objects
JVM
DSO Libraries
Terracotta Server
Clustering the JVM
Confidential – for information of designated recipient only. Copyright Terracotta 2006
Shared
Objects
JVM
DSO Libraries
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
Entire Swing Application
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);
}
}
Confidential – for information of designated recipient only. Copyright Terracotta 2006
Web Application: Root Declaration
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;
}
}
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
Web Application: JSP
<%@ 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>
Confidential – for information of designated recipient only. Copyright Terracotta 2006
Configuration File
<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>
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...
Confidential – for information of designated recipient only. Copyright Terracotta 2006