a
New Deployment Model
for
Servoy
Paul Bakker - The Orange Dots - ServoyWorld '17
High Availability
Static & versioned
Secure
No bloat
Automated
(fail-over, deployments, scaling)
.servoy export/import
WAR deployment
Servoy Cluster
/ single db
/ single db server
/ multi db servers
single app server
/ single db
/ single db server
/ multi db servers
multi app servers
stand-alone app server | WAR | stand-alone container | managed containers | |
---|---|---|---|---|
HA - automatic fail-over | nope | nope | nope | yup |
HA - zero downtime deployment | .servoy upload: possible | Tomcat Parallel Deployment? | Tomcat Parallel Deployment? | yup |
HA - scaling | nope | nope | nope | yup |
static & versioned | not enforced | to some extend | pretty much | pretty much |
Secure | ~ | ~ | ~ | ~ |
No Bloat | ~ | ~ | ~ | ~ |
Automated | can be done | can be done | can be done | a lot already done |
Every change === new server launch (and shutting down old versions)
⚫ ⚫ ⚫ ⚫
Different solution
&
Servoy versions in parallel
⚫ ⚫ ⚫ ⚫
Managed Containers
amqpbroadcaster.hostname=localhost
servoy.properties
GitHub
Generic database stuff
no Servoy Sequences
servoy.record.lock.lockInDB=true
databaseManager.acquireLock(...) ONLY within transactions
databaseManager.acquireLock(...) WON'T return until lock acquired (unless...)
no 'select * from ....'
no breaking datamodel changes
Safe operations | Comments |
---|---|
Add column | |
Drop column | assuming the app isn't using it anymore |
Add an index concurrently | |
Drop a constraint (for example, non-nullable) | |
Add a default value to an existing column |
Operations to avoid | Workarounds |
---|---|
Add index | Add index concurrently |
Change column type | Add new column, change code to write to both, backfill new column |
Add column with default value | Add column, add default in separate step, backfill column with default value |
Add non-nullable column | |
Add column with unique constraint | Add column, add unique index concurrently, add constraint |
VACUUM FULL | use pgrepack instead |
Overall: no long-running transactions/locks and queries
Operations to think about | |
---|---|
Adding foreign key constraints | Requires a AccessExclusive lock on both tables, potentially blocking read access |
No,
not this guys this time....
The other one -->>
Sticky sessions
Session draining
Controlled shutdown
API's interact only with current server
application.getActiveClientCount
application.getClientCountForInfo
plugins.headless.getClient/getOrCreateClient
maintenance plugin
usermanager plugin
clientmanager plugin
Misc
No pre/postImport hooks
Cleanup
HSQL as Servoy Repository
Embedded Servlet Engine
Java 9 Modules (?!?)
-
plugins, beans, drivers, lafs, services, component
-
servoy.properties
-
dependancies for unused Servoy Client types
Title Text
Level I:
- Cluster
- Nodes
- Pods
Level II:
- Ingress
- Services
- Deployments
- ReplicaSets
- Jobs
selector:
matchLabels:
run: paragon
matchExpressions:
- {key: exclude, operator: NotIn, values: [true]}
label selectors: Deployment / ReplicaSet / Service
labels
run: paragon
labels: Pods
Your database
RabbitMQ
....
Servoy
- Separate read/write database connections
- Table aliases
- DB connection credentials hook
Community
- (Postgres) datamodel migration best practices
- Feedback/input/....
Using
Docker
to deploy your
Servoy application
a New Deployment Model for Servoy
By paulbakker
a New Deployment Model for Servoy
- 2,277