Basically, the system is a web interface that shows at real-time vehicles on google maps and also users can build reports for past events based on input data like start timestamp, end timestamp, vehicle id and a bit more calibration staff.
So currently everything is on the same backend - the realtime logic and the logic of the reports (currently there are 50+ reports the user can choose from)
Due to the complexity of the reports and realtime data serialization, most of the database data associated with users and vehicles are loaded in memory.
However, from time to time (twice a day) there needs to be made improvements and or patch some bugs (for example some report logic needs to be changed a bit, or the front-end UI needs to be fixed, or the way the emails are sent needs to be modified for some clients) so I have to kill the users' sessions and deploy the fix but all this introduces downtime.
That's why I am considering dividing the system into multiple services and each of them to be on an independent server:
One independent service/server for the real-time data fetching and serialization. One independent service/server for reverse geocoding. One independent service/server for calculating and caching if current latitude/longitude is inside urban area or on a particular speed road. One independent service/server for daily reports. One independent service/server for event-based reports One independent service/server for email and other notifications. One independent service/server for tachograph data downloading and uploading to FTP.
and so on.
This way if some of the services need to be patched, fixed or upgraded I won't need to stop everything and kill the users' session.
(Please have in mind that there are daily requirements to change or introduce some logic in some of the services due to thousands of private clients who pull the strings and tell what should be made)
However, I have some objects like CustomDateTime, Vehicle, MarkedArea, DynamicPOI, ClosedGeoCurve, FuelFlowMeter, Canbus, GPSDeviceFirmware, UserSerializationPermissions, DistanceCalculationMethod and so on, that are heavily used across the system so if I divide the system on services and each of them is hosted on independent physical server machine I will need to have these Java objects on each of them and each time I introduce a new field, method and/or business logic to some of the classes I will have to deploy them again on each of the servers.
That's why I am still investigating what would be the best approach to handle this division and i will be more than happy if some of you show me the right direction using JEE architecture.
Thank you in advance.