Hi all!My day-job company is in the process of refactoring our in-house-built "middleware" into "something better"(tm). That "middleware" is currently using plain Tomcat as a container and Spring for "component configuration/wiring", publishing its services over SOAP. Due to increased requirements (uptime, clustering, monitoring, ease-of-maintenance, etc), we are looking into a major architecture redesign.
Functionally, the "middleware" is a /telco-grade/ piece of software that is used to build services that interface with the (mobile) operator systems (billing, SMSC, positioning information, etc) and provide a user interface over a variety of channels (wap, web, SMS, MMS, etc).
As an apache contributor, I would love to use (read: push ;-)) Geronimo as the base-container for this work. However, I'm not too familiar with the internals of Geronimo - so I would like to ask you to give me some feedback about the feasibility of this plan.
I've written up my own blue sky vision/ideas for that future container (see attachment). It is lacking in details, but I guess you get some sort of fuzzy feeling about the thing I'm trying to get at :-)
The aim could be summarized as: build a container that would be * simple for developer (no EJBs, stick to POJO's as much as possible)* simple for deployer/upgrader (container support for configuration management) * simple for Operations&Maintenance people (container support for monitoring, alarms) * easy to cluster (HA and load-balancing, no state in middle tier) in a reliable way (we have been throwing around the idea of routing all method calls over JMS)
I know that everything is possible in the world of software development (given enough time and money :-)) so I would narrow my questions a bit:
* is this thing a good fit, to be built on top of Geronimo? I guess yes.* maybe you can also give some arguments as to why Geronimo is a good fit for this? * and, going one step further, could you give some pointers as to how/where to start.
And, a final question: would you be interested in at least some of these features? As far as I can see, most of the stuff outlined in my blue-sky vision is not really specific to our company/industry, it is applicable to java development/deployment in general. So, there could be interest also from the broader community in implementing this beast and our company might be interested in contributing back the generic parts of our work.
What do you think? ;-) Rgds, NeemeTitle: MO/RefactoringProducts/PinPoint50Ideas/BlueSkyFeatures - Regio Wiki
an artifactPiece of functionality packaged in a way that is ready for deployment. Consists of:
Proper artifact versioning is very important - it should be possible to determine the level of compatibility between any two versions by just comparing the version numbers. The whole concept is built on top of Maven2 project descriptors.
CORE
The function of COREPublish a set of components (interfaces) to:
CORE can also be viewed as a "cloud" of middleware nodes in a cluster.
In addition to hosting and publishing the components themselves, the container also manages a set of shared libraries that components can use to provide their services.
a componentComponent consists of:
There can be a set of well-known component types that the container can use internally.
a component implementationImplements a single component type. Consists of:
Component definition can declare a dependency on other components and specify any special capabilities that it requires.
a component deploymentComponent deployments can be nested - if a component implementation depends on another component implementation that is truly internal to the implementation (needs custom configuration that is specific to the current component only) then the container can create a new (sub)component deployment to implement that dependency. Dependencies can be resolved in three ways:
Consists of:
Only externally available components can be remoted inside the cluster. The decision to execute a method call on a local node or a remote node could be made at runtime: the container could use the following criteria: if ([number of requests in queue on local node] * [average time of processing a single request on local node] > [number of requests in queue on remote node] * [average time of processing a single request on remote node] + [overhead incurred by remoting]) then send that method call for execution on remote node. This decision logic implies that all nodes have more-or-less up-to-date data available about the remote queue sizes, execution times and remoting overheads. Some of this data can be updated from the method calls themselves, but most of it probably has to be distributed on regular basis (e.g every 500 ms) Implementation note:
a component instanceInstance lives inside a separate classloader and only the component type (interface) is visible to the outside world.
configurationAll component deployments are configured with XML configuration files - no database is needed + it is much easier to evolve XML schemas and to implement versioning. Configuration changes:
By using easily distributable set of XML configuration files, we could also host a central repository of all client configurations, allowing to easily set up customer specific testing environments and to validate that all upgrades work in all customer configurations.
installations and upgradesInstallation is done by loading a descriptor into an empty container. The descriptor defines the components to be deployed (types, implementations, etc); required artifacts and libraries are downloaded and loaded into runtime environment by the container. The download doesn't have to be remote - the container could also load the files from local directories for offline installations. However, a repository accessible over http is recommended for cluster deployments, then all members of the cluster can download their code from there. Another note about cluster installations: after setting up the first cluster node, it is enough just to start up an empty container on the other machines with valid cluster configuration - the new nodes will join the cluster, get the active configuration from the running node and deploy it automatically. Upgrades are applied by changing the component deployment descriptors - this can be a mere configuration change or a specification for a new artifact version that will be downloaded and deployed. Upgrades definition/descriptor consists of
As we are dealing with XML, upgrade descriptor could be an XSLT script. But that is just one of the options, have to analyze the details when more is known about the deployment descriptors and the nature of changes that should be applied to them. Most probably XSLT is too generic and a more specialized "language" is better. Before applying an upgrade, the container can validate the upgrade by loading the new configuration and applying a set of (semi)automated functional tests to it. The deployer can inspect the results of the tests and make sure that all new and old functionality works as expected. In principle we could also implement update chaining (you have version 3.11 of some component and you tell the container to upgrade it to version 4.0 and the container can fill in the rest). But maybe this is overkill already, probably it is enough to make upgrades as easy as possible for the upgrader.
Upgrade preparation toolThis tool can be used to automate the upgrade descriptor writing: it can take an XML deployment descriptor and compare that to a component implementation - as a result, it will highlight any conflicts between the two. This can be used to make sure that all code changes that result in structural changes to XML deployment descriptors will be accounted for in the upgrade descriptor. When it has highlighted the conflicts, it could allow the developer to make the needed changes to the configuration, recording the changes transparently and then using that information to automatically generate an upgrade descriptor. This generated descriptor might need some manual fine-tuning but at least the bulk of the work can most probably be automated.
configuration toolAll configuration changes go through three steps:
Configuration tool should be a web application with rich-client-interface, most probably it would make sense to standardaze on Firefox (or any other XUL compatible browser) and implement the interface with XUL. Would get rid of the need to work around the bugs in IE _javascript_ and CSS layout engine. And XUL is very powerful for building nice user interfaces. Hopefully operators don't mind
In addition to configuring the properties through setters, it is also possible to monitor the health of the system by inspecting the values available from getters.
monitoring console(implemented with same technology as configuration tool, probably XUL) Monitoring console allows the O&M people to:
Monitored data descriptor includes:
Implementation notes:
MO/RefactoringProducts/PinPoint50Ideas/BlueSkyFeatures (last edited 2006-04-27 07:47:49 by neeme) |