Back to home page

Enduro/X

 
 

    


0001 # endurox
0002 EnduroX is Open Source Middleware Platform for Distributed Transaction 
0003 Processing
0004 
0005 Platform provides X/Open XATMI and XA APIs for C/C++ applications. EnduroX can 
0006 be considered as replacement for Oracle(R) Tuxedo(R), Jboss Blacktie (Narayan), 
0007 Hitachi OpenTP1 and other XATMI middlewares.
0008 
0009 EnduroX provides SOA architecture for C/C++ applications and allows to cluster 
0010 application in fault tolerant way over multiple physical servers. 
0011 EnduroX provides Oracle(R) Tuxedo(R) FML/FML32 library emulation, 
0012 including boolean expressions. Other Tuxedo specific APIs are supported, 
0013 such as tpforward() and work with distributed transactions (tpbegin(), 
0014 tpcommit(), etc.).
0015 
0016 EnduroX have binddings for:
0017 - Golang (client & server)
0018 - PHP (client)
0019 - Perl (client & server)
0020 - Python (client & server)
0021 - Node.js (client)
0022 
0023 ![Alt text](doc/Endurox-product.jpg?raw=true "Enduro/x overview")
0024 
0025 # Load balancing
0026 
0027 ![Alt text](doc/endurox-load-balance.jpg?raw=true "Enduro/x service load 
0028 balancer")
0029 
0030 Supported operating system: GNU/Linux, starting from 2.6.12 kernel 
0031 (needed for POSIX Queues). Starting with Enduro/X Version 3.1.2 IBM AIX (6.1 and 
0032 7.1), 
0033 Oracle Solaris 11, MAC OS X (experimental) and Cygwin (experimental) 
0034 support is added. Supported compilers: gcc, LLVM clang, IBM xlC.
0035 
0036 - Build and installation guides are located at: www.endurox.org/dokuwiki
0037 
0038 - Support forum: http://www.endurox.org/projects/endurox/boards
0039 
0040 - Binary builds (RPMs & DEBs) for various platforms are here: 
0041 http://www.endurox.org/projects/endurox/files
0042 
0043 - Documentation available here: http://www.endurox.org/dokuwiki/doku.php
0044 
0045 - Source corss reference: http://www.silodev.com/lxr/source
0046 
0047 PS, feel free to contact me at madars@mavimax.com. I will gladly help you
0048  to get EnduroX running ;)
0049 
0050 # Call/message forwarding
0051 
0052 ## Instead of doing calls to each server separately...
0053 
0054 ![Alt text](doc/exforward_tpcall.png?raw=true "Classical service orchestration")
0055 
0056 This is typciall way for example if doing micro-services with HTTP/REST. 
0057 You need to do the calls to each service separately. And that is extra 
0058 overhead to system (multiple returns) and the caller must orchestrate the all 
0059 calls.
0060 
0061 ## ...Enduro/X offers much effective way - tpforward() where request is 
0062 passed around the system
0063 
0064 ![Alt text](doc/exforward_forward.png?raw=true "Enhanced service 
0065 orchestration by forwarding the call")
0066 
0067 In this case the destination service orchestrates the system, it is up to 
0068 service to choose the next service which will continue the call processing. 
0069 The caller is not aware of final service which will do the reply back 
0070 (tpreturn()).
0071 
0072 Note that service after doing "tpforward()" becomes idle and can consume next 
0073 call.
0074 
0075 # High availability and self healing
0076 
0077 Enduro/X is capable of detecting stalled/hanged XATMI servers and gracefully 
0078 can reboot them. The ping times are configurable on per server basis. In case 
0079 if main daemon dies, it is possible to configure special XATMI server named 
0080 "tprecover" which monitors "ndrxd" and vice versa, ndrxd can monitor tprecover. 
0081 Thus if any of these services are not cleanly shut down, then system will 
0082 heal it self, and boot service/daemons back.
0083 
0084 The ndrxd learning mode is some period of time (configurable) in which ndrxd 
0085 will request all the system for active servers and their services, 
0086 to get back the view of the system and be in control. Note that system is able 
0087 to work even with out ndrxd, but at that time no server healing 
0088 and management will be done.
0089 
0090 ![Alt text](doc/server_monitoring_and_recovery.png?raw=true "Enduro/X high 
0091 availability facility")
0092 
0093 # Real time system patching
0094 
0095 It is possible to patch the Enduro/X system (update stateless XATMI servers) 
0096 without service interruption. This is achieved by following scheme:
0097 
0098 ![Alt text](doc/rt-patching.png?raw=true "Enduro/X real time patching")
0099 
0100 # Performance
0101 
0102 Due to fact that Enduro/X uses memory based queues, performance numbers are 
0103 quite high:
0104 
0105 ## ATMI client calls server in async way (tpacall(), no reply from server)
0106 
0107 ![Alt text](doc/benchmark/04_tpacall.png?raw=true "Local tpcall() performance")
0108 
0109 
0110 ## Local one client calls server, and gets back response:
0111 
0112 ![Alt text](doc/benchmark/01_tpcall.png?raw=true "Local tpcall() performance")
0113 
0114 ## Multiple clients calls multiple servers
0115 
0116 ![Alt text](doc/benchmark/03_tpcall_threads.png?raw=true "Multiprocessing 
0117 tpcall() performance")
0118 
0119 ## Single client calls single server via network (two app servers bridged)
0120 
0121 ![Alt text](doc/benchmark/02_tpcall_network.png?raw=true "Network tpcall() 
0122 performance")
0123 
0124 ## Persistent storage (message enqueue to disk via tpenqueue())
0125 The number here are lower because messages are being saved to disk. 
0126 Also internally XA transaction is used, which also requires logging to stable 
0127 storage.
0128 
0129 ![Alt text](doc/benchmark/05_persistent_storage.png?raw=true "Network 
0130 tpenqueue() performance")
0131 
0132 # Releases
0133 
0134 - Version 2.5.1 released on 18/05/2016. Support for transactional 
0135 persistent message queues. Provides APIs: tpenqueue(), tpdequeue() and 
0136 command line management tools. See doc/persistent_message_queues_overview.adoc, 
0137 doc/manpage/tmqueue.adoc, doc/manpage/xadmin.adoc, doc/manpage/q.config.adoc. 
0138 Use cases can be seen under atmitests/test028_tmq
0139 
0140 - Version 3.1.2 released on 25/06/2016. Added support for other Unix systems. 
0141 Currently production grade support is provided for following operating systems: 
0142 GNU/Linux, FreeBSD, IBM AIX and Oracle Solaris. MAC OS X and Cygwin versions 
0143 are 
0144 considered as experimental. FreeBSD installation guides are located at 
0145 doc/freebsd_notes.adoc, AIX install guide: doc/aix_notes.adoc, 
0146 Solaris install guide: doc/solaris_notes.adoc and OS X guide: 
0147 doc/osx_notes.adoc. Also with this version lot of core processing bug fixes are 
0148 made.
0149 
0150 - Version 3.2.1 released on 06/07/2016. Major UBF optimization. Now for each 
0151 data type memory offset is maintained. For fixed data types (short, long, char, 
0152 float, double) binary search is performend when field is read from buffer.
0153 
0154 - Version 3.2.2 released on 15/07/2016. Bugfixes for UBF binary search. Added 
0155 UBF benchmarking scripts and documents.
0156 
0157 - Version 3.3.1 released on 05/09/2016. Implemented common configuration engine 
0158 (can use ini files in alternative to environment variables, debug config and 
0159 persistent queue config).
0160 
0161 - Version 3.3.2 released on 01/10/2016. Works on TP logger, user accessible 
0162 logging framework. Set of tplog\* functions.
0163 
0164 - Version 3.3.5 released on 10/01/2017. Fixes for RPM build and install on 
0165 Red-hat enterprise linux platform.
0166 
0167 - Version 3.3.6 released on 12/01/2017. Fixes for integration mode, changes in 
0168 tpcontinue().
0169 
0170 - Version 3.4.1 released on 13/01/2017. New ATMI server flag for developer - 
0171 reloadonchange - if cksum change changed on binary issue sreload.
0172 
0173 - Version 3.4.2 released on 20/01/2017. Network protocol framing moved from 2 
0174 bytes to 4 bytes.
0175 
0176 - Version 3.4.3 released on 26/01/2017. Memory leak fixes for tmsrv and tmqueue 
0177 servers.
0178 
0179 - Version 3.4.4 released on 26/01/2017. Works on documentation. Fixes on 
0180 PScript.
0181 
0182 - Version 3.4.5 released on 14/02/2017. Fixes in generators.
0183 
0184 - Version 3.5.1 released on 03/03/2017. Updates on tpreturn() - more correct 
0185 processing as in Tuxedo, free up return buffer + free up auto buffer.
0186 
0187 - Version 3.5.2 released on 24/03/2017. Bug #105 fix. Abort transaction if it 
0188 was in "preparing" stage, and tmsrv loaded it from logfile. Meaning that caller 
0189 alaready do not wait for tpcommit() anymore and got inconclusive results, thus 
0190 better to abort. 
0191 
0192 - Version 3.5.3 released on 26/03/2017. Fixes for Solaris, Sun Studio (SUNPRO) 
0193 compiler
0194 
0195 - Version 3.5.4 released on 01/03/2017. Fixed bug #108 - possible CPM crash
0196 
0197 - Version 3.5.5 released on 23/03/2017. Works Feature #113 - mqd_t use as file 
0198 descriptor - for quick poll operations.
0199 
0200 - Version 3.5.6 released on 02/04/2017. Fixed issues with possible deadlock for 
0201 poll mode on bridge service calls. Fixed issuw with 25 day uptime problem for 
0202 bridges on 32bit platfroms - the messages becomes expired on target server. 
0203 Issues: #112, #145, #140, #139, #113
0204 
0205 - Version 3.5.7 release on 23/04/2017. Fixed Bug #148 (Bdelall corrupts ubf 
0206 buffer)
0207 Bug #110 (tpbridge does not report connection status to ndrxd after ndrxd is 
0208 restarted for recovery)
0209 
0210 - Version 3.5.9 released on 22/06/2017. Bug fix #160 - retry xa_start with 
0211 xa_close/xa_open. New env variable NDRX_XA_FLAGS, tag "RECON".
0212 
0213 - Version 4.0.1 released on 29/06/2017. Multi-threaded bridge implementation. 
0214 tpnotify(), tpbroadcast(), tpsetunsol(), tpchkunsol() API implementation.
0215 
0216 - Version 4.0.2 released on 19/07/2017. Fixed ndrxd core dump issue Bug #174.
0217 
0218 - Version 4.0.3 released on 26/07/2017. Fixes of #176 #178. NDRX_DUMP, UBF_DUMP 
0219 fixes.
0220 
0221 - Version 4.0.4 released on 29/07/2017. Feature #162 - added evt_mib.h
0222 
0223 - Version 4.0.5 released on 01/08/2017. Feature #180 - refactoring code towards 
0224 ISO/IEC 9899:201x standard.
0225 
0226 - Version 5.0.1 released on 21/08/2017. Feature #96 - Typed View support, Bug 
0227 #182 - fix in bridge protocol.
0228 
0229 - Version 5.0.2 released on 22/08/2017. Bug #183
0230 
0231 - Version 5.0.3 released on 22/08/2017. Bug #186
0232 
0233 - Version 5.0.4 released on 22/08/2017. Bug #186
0234 
0235 - Version 5.0.5 released on 27/08/2017. Bug #184, Bug #191, Bug #190, Bug #192, 
0236 Bug #193
0237 
0238 - Version 5.0.6 released on 28/08/2017. Bug #195
0239 
0240 - Version 5.0.7 released on 01/09/2017. Feature #161 - tmsrv database pings & 
0241 automatic reconnecting in case of network failures.
0242 
0243 - Version 5.0.8 released on 17/09/2017. Works on dynamic view access. #99, #206, 
0244 #207, #210
0245 
0246 - Version 5.0.9 released on 27/09/2017. (development) Works on #224
0247 
0248 - Version 5.0.10 released on 13/10/2017. (stable) Feature #232, Feature #231, 
0249 -O2 optimization by default
0250 
0251 - Version 5.1.1  released on 13/10/2017. (development) Feature #127, Bug #229, 
0252 Feature #230, Bug #234, Feature #244, Bug #243, Feature #248, Bug #240, Bug #238 
0253 
0254 - basically big message size support (over the 64K)
0255 
0256 - Version 5.1.2  released on 18/10/2017. (stable) Bug #250
0257 
0258 - Version 5.2.1  released on 18/12/2017. (development) Major work on support for PCI/DSS mandatory
0259 configuration encryption. Introduction of plugin architecture (currently used for
0260 crypto key providers). Implemented tpconvert() ATMI call. Now @global section for ini files are 
0261 read twice. Thus ini file can reference to previosly defined env/global variable. 
0262 Fixes: #261 Bug, #118 Feature, #237 Feature, #236 Bug, #245 Feature, #258
0263 Support, #259 Support, #255 Bug, #254 Bug.
0264 
0265 - Version 5.2.2 released on 21/12/2017. (stable) First stable version of Enduor/X 5.2. Rolled
0266 
0267 - Version 5.2.4 released on 22/12/2017. (stable) Fixed Bug #268.
0268 
0269 - Version 5.2.6 released on 02/01/2018. (stable) Happy New Year! Fixed Bug #269.
0270 
0271 # Build configurations
0272 
0273 ## Configure make with: 
0274 
0275 $ cmake -DCMAKE_INSTALL_PREFIX:PATH=`pwd`/dist .
0276 
0277 ### Flags:
0278 
0279 - To disable GPG_ME, pass additional flag to cmake '-DDEFINE_DISABLEGPGME=ON'
0280 
0281 - To disable documentation building add '-DDEFINE_DISABLEDOC=ON'
0282 
0283 - To enable poll() use instead of epoll() in Linux use '-DDEFINE_FORCEPOLL=ON'
0284 
0285 - To disable platform script building use '-DDEFINE_DISABLEPSCRIPT=ON'
0286 
0287 - To do release build, use '-DDEFINE_RELEASEBUILD=ON'
0288 
0289 - To force use emulated message queue, add '-DDEFINE_FORCEEMQ=ON'
0290 
0291 - To log the memory allocation to user log add '-DNDRX_MEMORY_DEBUG=1' 
0292 
0293 - To trace of the Object-API use '-DNDRX_OAPI_DEBUG=1' 
0294 
0295 - To enable file descriptor based treating of the queues 
0296 '-DDEFINE_FORCEFDPOLL=ON'
0297 
0298 - To trace of the Semaphore handling use '-DNDRX_SEM_DEBUG=1' 
0299 
0300 - To enable test047 with Oracle PRO*C database access use '-DENABLE_TEST47=ON'
0301 Note that *proc* must be in path and ORACLE_HOME must be set. Also Oracle DB 
0302 libraries must be present in LD_LIBRARY_PATH (or equivalent environment for 
0303 target OS).