Resource-Oriented Computing W/ Netkernel
Total Page:16
File Type:pdf, Size:1020Kb
Resource-Oriented Computing w/ NetKernel : Software for the 21st Century Brian Sletten Zepheira, LLC [email protected] Speaker Qualifications Over 14 years of software development experience Has own software consulting company for design, mentoring, training and development Currently working in Semantic Web, AOP, Grid Computing, P2P and security consulting Pinky Committer Agenda What the heck is NetKernel? Why We Care NetKernel Overview NetKernel Languages Advanced Concepts Pinky What the heck is NetKernel? A micro-kernel based resource ecosystem built around the principles of REST, Unix Pipes and SOA Why We Care: The Simple Answer Most enterprise systems use XML and are built in Java and this is still too much of a pain Complicated Different Languages for different technologies Predicting scalability Why We Care : The Complicated Answer This is hard because of a general mismatch at the intersection of languages, data model, processing abstractions, architectural tiers, etc. Larger Trends Data formatted Code written 1970s 1980s 1990s 2000s NetKernel A Ground-Up Resource-oriented computing environment Modern, microkernel architecture Takes the best of REST, Unix Pipes, SOA Open Source w/ Dual License for non-open source uses Resource-Oriented Computing Everything is a Resource Everything is URI-Addressable (logical reference) “Computation” is the turning of logical resource references into physical representation Lossless conversion between representations REST Representational State Transfer Architectural style described in Roy Fielding’s Ph.D. thesis URLs locate resources in Internet-sized address spaces Client passes all state in request History of Addressing ----- ----- ----- Documents Network http://myserver.com/docs/reports/3rdQtr/ History of Addressing Network http://myserver.com/data/graph/1 Data History of Addressing http://myserver.com/service/a Network Service A Services URLs ! => Scalability Addressability of the resources is important, but REST derives its properties from the architectural constraints REST Properties Unix Influences Everything is a file (common interface/ resource abstraction) Small, focused, reusable tools Tools are scripted Processes have context from environment SOA Influences Loosely-coupled Asynchronous requests Reusable services composed through orchestration languages Putting the Kernel in NetKernel Internally, a microkernel manages threading resources Maps URI requests to managed resources and schedules them General Concept Calling a BeanShell Script XQuery XSLT Active URIs Internally, NetKernel uses a special URI naming scheme A proposed IETF standard by HP and 1060 Research to encode complex URIs into standard forms General form active:<processURI>*(+<inputName>@<inputURI>) http://ietf.mirror.netmonic.com/draft-butterfield-active-uri-01.txt Sample Active URIs BeanShell active:[email protected][email protected] XQuery active:[email protected][email protected] XSLT active:[email protected][email protected] NetKernel Benefits “Deep” REST environment Appropriate abstractions Focus on information, not code! Layered approach to building applications Logical connections/requests get resolved at runtime (late-binding) NetKernel Properties Fine-grained caching Self-optimizing based on use “Aspect-Oriented” architecture Security, logging, etc. behind URI interception Tiny Footprint Can do “real” work in a VM w/ 10-12MB Takes full advantage of multi-core, multi-CPU boxes Basic NetKernel Tour NetKernel Concepts (aka Really Cool Terms) Accessors Transports Representations Aspects Transreptors Accessors URI-addressable component that provides access to NetKernel resources and services Transport A component that funnels requests from external sources into NetKernel URI requests (and ultimately Accessors) Examples HTTP SMTP JMS Representations The ‘R’ in REST In NetKernel, an object representing the resource Exposed via immutable, cacheable “views” Aspects Not AOP “Aspects” Immutable views of the underlying representation in a given form Examples JDOM, DOM, String, BinaryStream Transreptors Fancy term for “transforming representations” Transreptors return a resource in a specified form if conversion is possible Useful for converting between Aspects NetKernel Languages DPML A simple NetKernel scripting language for specifying URI requests Supports conditionals, loops, subroutines, etc. DPML Sample <idoc> <seq> <instr> <type>copy</type> <operand>ffcpl:/usr/local/NetKernel/ modules/workbench/nfjs/hello.xml</operand> <target>this:response</target> </instr> </seq> </idoc> Basic Examples XQuery XML Query Language W3C Candidate Recommendation Functional language FLWOR (For Let Where Order By Return) XQuery Sample <abbeysayings> { for $author in doc("active:xquery+operator@file:/usr/local/ NetKernel/modules/workbench/nfjs/quotations/ authors.xq")//* where $author/name/last = 'Abbey' return $author/quotation } </abbeysayings> BeanShell Supports embedded BSH interpreter Java source interpreter Interacts with other scripts, Java, etc. Makes for very fast scripting BeanShell Sample void main() { // Extract all speeches with lines // containing the parameter argument req=context.createSubRequest(); req.setURI("active:xquery"); req.addArgument("operator","abbey.xq"); output=context.issueSubRequest(req); //Finally return response response=context.createResponseFrom(output); context.setResponse(response); } “Real World” Examples XSLT Input Data XSLT Example if( context.exists("this:param:param") ) { param=context.sourceAspect("this:param:param", IAspectNVP.class); mbid = param.getValue("mbid"); } req=context.createSubRequest(); req.setURI("active:httpGet"); url="http://musicbrainz.org/ws/1/artist/" +mbid+ "?type=xml&inc=sa-Album"; req.addArgument("url", url); output=context.issueSubRequest(req); sa= new StringAspect("<albums>" + mbid + "</albums>"); req=context.createSubRequest(); req.setURI("active:xslt"); req.addArgument("operand", output); req.addArgument("operator", "albums.xsl"); req.addArgument("band", sa); output=context.issueSubRequest(req); XSLT Stylesheet <xsl:param name="band"/> <xsl:template match="mo:metadata/mo:artist/mo:release-list"> <html> <body> <h1>Results for <xsl:value-of select="../mo:name"/></h1> <table border="1"> <xsl:apply-templates/> </table> </body> </html> </xsl:template> <xsl:template match="mo:release"> <tr><xsl:apply-templates/></tr> </xsl:template> <xsl:template match="mo:title"> <xsl:variable name="id" select="../@id"/> <xsl:variable name="url" select="concat('http://musicbrainz.org/ws/1/release/',$id)"/> <td><a href="{$url}?type=xml&inc=tracks"><xsl:value-of select="."/></a></td> </xsl:template> XSLT Examples STM Simple Tree Manipulation Kind of a DSL for XML XML is tree-oriented, let’s use it that way stm:set Sets element values to the specified value <stm:set select=”/x/y” xpath=”/a/b[1]/c”> <x> <y>zebra</y> </x> </stm:set> <a> <a> <b> <b> <c food="hay">horse</c> <c food="hay">zebra</c> </b> </b> <b> <b> <c food="hay">donkey</c> <c food="hay">donkey</c> </b> </b> </a> </a> stm:insert-after Inserts specified value after the selected element <stm:insert-after xpath=”/a/b[1]”> <x> <y>zebra</y> </x> <a> </stm:insert-after> <b> <c food="hay">horse</c> <a> </b> <b> <x> <c food="hay">horse</c> <y>zebra</y> </b> </x> <b> <b> <c food="hay">donkey</c> <c food="hay">donkey</c> </b> </b> </a> </a> stm:apply-ns Applies the specified namespace to the selected elements <stm:apply-ns prefix=”ns” uri=”http://www.bosatsu.net/ns” xpath=”/a/b[2]”/> <a> <b> <c food="hay">zebra</c> </b> <ns:b xmlns=”http://www.bosatsu.net/ns”> <ns:c food="hay">donkey</ns:c> </ns:b> </a> Advanced Concepts Asynchronous Requests Asynchronous requests are easy in NetKernel // Set up request 1 req1=context.createSubRequest(); req1.setURI("active:beanshell"); req1.addArgument("operator", “script1.bsh” ); req1.addArgument("param", param ); handle1 = context.issueAsyncSubRequest(req1); // Set up request 2 req2=context.createSubRequest(); req2.setURI("active:beanshell"); req2.addArgument("operator", “script2.bsh” ); req2.addArgument("param", param ); handle2 = context.issueAsyncSubRequest(req2); // Block until both calls finish retValue1 = handle1.join(); retValue2 = handle2.join(); Throttling Requests Throttling requests is also easy // attempt to issue 100 concurrent requests to script1.bsh for (int i=0; i<100; i++) { req=context.createSubRequest("active:throttle"); req.addArgument("id","throttle:my_throttle"); req.addArgument("uri","active:beanshell"); req.addArgument(“operator”,”myscript.bsh”); context.issueAsyncSubRequest(req); } Expects to find a configuration file in ffcpl:/etc/ConfigThrottle.xml <throttle> <concurrency>4</concurrency> <queue>50</queue> </throttle> Golden Thread Pattern Virtual Dependency Management Powerful technique for invalidating arbitrary collections of resources Easier to see than hear about! Scalability - Scenario 1 Long Computation wrapped in an Accessor called from a DPML script Scalability - Scenario 2 Shorter Computation called multiple times from DPML script Scalability - Scenario 3 Random document chosen from DPML script Modules Real NetKernel Infrastructure is built around modules Modules (cont) Ways of segmenting Address Space and functionality Modules export public URIs and class packages Separately Versioned units of deployment Modules (cont) Can hold static resources, Java code, scripts, accessors, aspects, transreptors, transports, fragmentors and caches Import module definitions to access another namespace If you create a new module, you will need to at it