\input{configpres}
\title{\lq Middleware\rq}
\maketitle
\begin{frame}
\frametitle{Agenda}
\begin{itemize}
\item Overview
\item XML based Middleware
\item Celery
\item D-Bus
\item CORBA
\end{itemize}
GOAL: get an idea about:
the amount of available middleware solutions
and for what they can be used.
\end{frame}
\subsection{Overview}
\begin{frame}
\frametitle{Use-case}
\begin{center}
\includegraphics[width=0.8\textheight]{images/714px-Middleware_Schema.png}
\end{center}
\tiny Source: http://commons.wikimedia.org/wiki/File:Middleware\_Schema.svg
\end{frame}
\begin{frame}
\frametitle{Why should we use a middleware?}
\begin{itemize}
\item IPC
\item scalability
\item os abstraction
\item reusability of sw components
\end{itemize}
\end{frame}
\begin{frame}
\frametitle{Kinds of Middleware}
\begin{itemize}
\item Message Oriented Middleware (MOM)
\item Remote Procedure Calls (RPC)
\item Webapplications?
\end{itemize}
\end{frame}
\begin{frame}
\frametitle{Requirements}
\begin{block}{Abstraction Layers}
\begin{itemize}
\item operating system
\item programing language
\item localization
\item transport
\item concurrent access
\end{itemize}
\end{block}
\end{frame}
\begin{frame}
\frametitle{Requirements}
\begin{block}{Technical, product specific}
\begin{itemize}
\item os / language support
\item performance
\item requirement coverage
\item commerical, open-source, (long-time) support
\end{itemize}
\end{block}
\end{frame}
\begin{frame}
\frametitle{Standards, Protocols}
\begin{itemize}
\item XML based Middleware
\item Celery - Job Queue Protocol
\item D-Bus - MOM
\item CORBA - Common Object Request Broker
\end{itemize}
\end{frame}
\subsection{XML based Middleware}
\begin{frame}
\frametitle{popular protocols}
\begin{description}
\item[XML-RPC] Extensible Markup Language Remote Procedure Call
\item[SOAP/WSDL] many webservices are based on SOAP
\item[XMPP] Extensible Messaging and Presence Protocol
\end{description}
\end{frame}
\begin{frame}
\frametitle{XML-RPC}
\begin{itemize}
\item native supported by Python (see example)
\item C/C++ Implementation: http://xmlrpc-c.sourceforge.net/
\item Client- / Serverarchitecture
\item uses http as transport
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{XML-RPC example in Python}
server.py\#p1
\begin{lstlisting}[language=python]
from datetime import datetime
from SimpleXMLRPCServer import SimpleXMLRPCServer
import xmlrpclib
def today ():
today = datetime.today ()
return xmlrpclib.DateTime (today)
def load ():
fd = open ("/proc/loadavg", "r")
loadavg = fd.read ()
sysload = loadavg.split ()
return xmlrpclib.FloatType (sysload[0])
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\frametitle{XML-RPC example in Python}
server.py\#p2
\begin{lstlisting}[language=python]
server = SimpleXMLRPCServer (("localhost",
8000))
server.register_function (today, "today")
server.register_function (load, "load")
print "Listening on port 8000..."
server.serve_forever ()
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\frametitle{XML-RPC example in Python}
client.py\#p1
\begin{lstlisting}[language=python]
import xmlrpclib
from datetime import datetime
proxy = xmlrpclib.ServerProxy (
"http://localhost:8000/")
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\frametitle{XML-RPC example in Python}
client.py\#p2
\begin{lstlisting}[language=python]
today = proxy.today ()
# today = 20140218T14:23:45
conv = datetime.strptime (today.value,
"%Y%m%dT%H:%M:%S")
print "Today:", conv.strftime (
"%d.%m.%Y, %H:%M")
load = proxy.load ()
print "system load:", load
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\frametitle{XML-RPC example in Python}
output:
\begin{lstlisting}[language=bash]
% python client.py
Today: 18.02.2014, 14:26
system load: 0.45
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\frametitle{XML-RPC example in Python}
http payload of today rpc call seen in wireshark:
\begin{lstlisting}[language=XML]
today
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\frametitle{XML-RPC example in Python}
http payload of today rpc response seen in wireshark:
\begin{lstlisting}[language=XML]
20140218T14:26:25
\end{lstlisting}
\end{frame}
\begin{frame}
\frametitle{SOAP/WSDL}
\begin{block}{Overview}
\begin{itemize}
\item WSDL (Web Services Description Language)
describes the interface and spcecial datatypes
\item the SOAP protocol is used for communication
\item SOAP can be used with various transports:
FTP, SMTP, HTTP(S), JMS
\item hopping is supported, with different transports
\item Client- / Serverarchitecture
\end{itemize}
\end{block}
\end{frame}
\begin{frame}
\frametitle{SOAP/WSDL}
\begin{block}{Implementations}
\begin{itemize}
\item ZSI: Python
\item KDSOAP: Qt4/5 native Library (commercial)
\item gSOAP: C/C++
\item Apache Axis2: C++, JAVA
\item Apache CXF: JAVA (+ other middleware protocols)
\item SOAP::WSDL: Perl
\item SOAP4R: Ruby
\item wsdl2objc: Objective C
\item .NET, mono
\end{itemize}
\end{block}
\end{frame}
\begin{frame}[fragile]
\frametitle{SOAP example in Python/ZSI}
server.py
\begin{lstlisting}[language=python]
from datetime import datetime
from ZSI import dispatch
def today (arg):
print "today arg:", arg
today = datetime.today ()
return str (today)
def load (arg):
print "load arg:", arg
fd = open ("/proc/loadavg", "r")
loadavg = fd.read ()
sysload = loadavg.split ()
return sysload[0]
dispatch.AsServer (port=8000, rpc=True)
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\frametitle{SOAP example in Python/ZSI}
client.py
\begin{lstlisting}[language=python]
from datetime import datetime
from ZSI.client import Binding
b = Binding (url='http://localhost:8000/')
t = b.today (5)
# t = 2014-02-18 15:59:50.571927
c = datetime.strptime (t,
"%Y-%m-%d %H:%M:%S.%f")
print "Today:", c.strftime ("%d.%m.%Y, %H:%M")
print b.load ("string")
\end{lstlisting}
\end{frame}
\begin{frame}
\frametitle{XMPP - Extensible Messaging and Presence Protocol}
\begin{block}{Overview}
\begin{itemize}
\item protocol for MOM based on XML
\item originally named Jabber
\item used for
\begin{itemize}
\item real-time Instant Messaging
\item publishing Presence Informations
\item Contactlist maintenance
\end{itemize}
\end{itemize}
\end{block}
\end{frame}
\begin{frame}
\frametitle{Extensible Messaging and Presence Protocol}
\begin{block}{IM for Industry??}
\begin{itemize}
\item free and open standard (IETF RFC 6120, 6121)
\item XMPP servers can be isolated, security is implemented (SASL, TLS)
\item TCP and HTTP(S) transports are supported
\item Priority support: multiple logins from same account,
login with highest pority gets message
\item not just used for IM:
\begin{itemize}
\item smart grid
\item publish-subscribe systems
\item games
\item signalling for VoIP
\end{itemize}
\end{itemize}
\end{block}
\end{frame}
\begin{frame}
\frametitle{Extensible Messaging and Presence Protocol}
\begin{block}{Extensible\dots}
\begin{itemize}
\item network management
\item collaboration tools
\item file sharing, gaming
\item remote systems control and monitoring
\item geolocation
\end{itemize}
\end{block}
\end{frame}
\begin{frame}
\frametitle{Extensible Messaging and Presence Protocol}
\begin{block}{Implemmentations}
\dots too many to mention, have a look at
http://xmpp.org/xmpp-software/
for libraries, clients and servers
\end{block}
\end{frame}
\begin{frame}[fragile]
\frametitle{XMPP Client Example}
xmpp\_client.cpp
\begin{lstlisting}[language=C++]
#include
#include "myclient.h"
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
MyClient client;
client.connectToServer("qtapp@localhost",
"test");
return app.exec();
}
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\frametitle{XMPP Client Example}
myclient.h
\begin{lstlisting}[language=C++]
#include
class MyClient : public QXmppClient
{
Q_OBJECT
public:
MyClient();
~MyClient();
public slots:
void message_rx(const QXmppMessage&);
};
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\frametitle{XMPP Client Example}
myclient.cpp\#p1
\begin{lstlisting}[language=C++]
#include
#include
#include "myclient.h"
MyClient::MyClient() : QXmppClient()
{
bool check = connect(this,
SIGNAL(messageReceived(QXmppMessage)),
SLOT(message_rx(QXmppMessage)));
Q_ASSERT(check);
Q_UNUSED(check);
}
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\frametitle{XMPP Client Example}
myclient.cpp\#p2
\begin{lstlisting}[language=C++]
MyClient::~MyClient() { ; }
void
MyClient::message_rx(const QXmppMessage& msg)
{
QString from = msg.from();
QString body = msg.body();
std::cout<, 'Model': <'My Passport0748'>,
'Revision': <'1015'>, 'Serial': <'57584D314335325839363238'>,
'WWN': <''>, 'Id': <'WD-My-Passport-0748-57584D314335325839363238'>,
'Configuration': <@a{sv} {}>, 'Media': <''>,
'MediaCompatibility': <@as []>, 'MediaRemovable':,
'MediaAvailable': , 'MediaChangeDetected': ,
'Size':,
'TimeDetected': ,
'TimeMediaDetected': ,
'Optical': , OpticalBlank': ,
'OpticalNumTracks': ,
'OpticalNumAudioTracks': ,
'OpticalNumDataTracks': ,
'OpticalNumSessions': ,
'RotationRate': <-1>, 'ConnectionBus':<'usb'>,
'Seat': <'seat0'>, 'Removable': , 'Ejectable': ,
'SortKey': <'01hotplug/1392720111627238'>,
'CanPowerOff': ,
'SiblingId':<'/sys/devices/pci0000:00/0000:00:14.0/usb2/2-1/2-1:1.0'>}})
\end{verbatim}
\end{frame}
\begin{frame}[fragile]
\frametitle{Example: Session Bus Signals}
\begin{itemize}
\item have a look at the code
\item start pingserver and pingclient
\item monitor signals with 'mdbus2 -l'
\end{itemize}
\end{frame}
\subsection{CORBA}
\begin{frame}
\frametitle{Common Object Request Broker Architecture}
\begin{itemize}
\item hosting of objects / RPC
\item typically a Client- / Serverarchitecture
\item one application can be Client and Server at the same time
\end{itemize}
\end{frame}
\begin{frame}
\frametitle{well-known implementations}
\begin{itemize}
\item omniORB: C++ / Python
\item ACE/TAO: C++ including RTCORBA support
\item MICO: C++ focus on security
\item JacORB: JAVA
\item IIOP.NET: .NET Remoting integration
\item ORBit2: C with C++ and Python bindings
\end{itemize}
\end{frame}
\begin{frame}
\frametitle{communication between different operating systems}
\begin{itemize}
\item hosting of objects is abstracted, e.g. ThreadPool
\item use of OS services, e.g. sockets is abstracted
\end{itemize}
\end{frame}
\begin{frame}
\frametitle{communication between programming languages}
\begin{itemize}
\item CORBA uses its own datatypes
\item datatype mapping needs to be implement for each language
\end{itemize}
\end{frame}
\begin{frame}
\frametitle{common transports}
\begin{itemize}
\item IIOP
\item socket
\item shared-memory
\item implementing own transports is possible
\end{itemize}
\end{frame}
\begin{frame}
\frametitle{Functional Principle}
\begin{center}
\includegraphics[width=1.0\textwidth]{images/orb.jpg}
\end{center}
\end{frame}
\begin{frame}
\frametitle{Functional Principle}
\begin{block}{IDL Interface Description Language}
\begin{itemize}
\item write Interface Description
\item use IDL compiler to produce stubs and skeleton code
\item implement interfaces and use interfaces in native language
\item compile applications
\end{itemize}
\end{block}
\end{frame}
\begin{frame}
\frametitle{Functional Principle}
\begin{block}{Policies}
\begin{itemize}
\item Server- or Clientsiede Policies
\item Run-time and compile-time Policies
\item e.g. for
\begin{itemize}
\item Lifetime of objects
\item Activation of objects
\item Thread Policies
\item Connection Polies
\end{itemize}
\end{itemize}
\end{block}
\end{frame}
\begin{frame}
\frametitle{Functional Principle}
\begin{block}{CORBA Services}
\begin{itemize}
\item Naming Service
\begin{itemize}
\item Task A: bind object ior with name to Naming Service
\item Task B: resolve object ior by name from Naming Service
\end{itemize}
\item Messaging Service
\begin{itemize}
\item Task A: send messages to Messaging Service (Publisher)
\item Task B: subscribe for messages, e.g. filtered by topic, from the
Messaging Service
\end{itemize}
\end{itemize}
\end{block}
\end{frame}
\begin{frame}
\frametitle{Real-time CORBA Extensions}
\begin{center}
\includegraphics[height=0.7\textheight]{images/rtcorbaext.jpg}
\end{center}
\begin{raggedright}
%\scriptsize OMG Real-time CORBA speccification
\end{raggedright}
\end{frame}
\subsubsection{ACE/TAO Framework}
\begin{frame}
\frametitle{ACE/TAO Software Architecture}
\begin{center}
\includegraphics[height=0.7\textheight]{images/ace.jpg}
\end{center}
\begin{raggedright}
\scriptsize http://cs.wustl.edu/schmidt/ACE
\end{raggedright}
\end{frame}
\begin{frame}
\frametitle{TAO, Real-time CORBA Distribution}
\begin{block}{Facts}
\begin{itemize}
\item c++ implementation
\item based on ACE (operating system independent)
\item RTCORBA specification implemented
\item open source software
\item commercial support
\item widely used
\end{itemize}
\end{block}
\end{frame}
\subsection{Conclusion}
\begin{frame}
\frametitle{Conclusion}
\begin{itemize}
\item many frameworks available
\item different kind of abstraction
\item special frameworks for special problems
\item which framework is best for my problem?
\item is it helpful to use multiple frameworks?
\end{itemize}
\end{frame}
\input{tailpres}