ColdFusion Summit Notes: ColdFusion For the Next Decade, Rakshith Naresh
October 03, 2019
Significant progress in new features in the language
CF 2020 - see how it’s evolved in the last few months.
Next year will be the 25 year anniversary of ColdFusion
At a crucial juncture in product transformation right now
Where is ColdFusion Headed?
if CF will stay relevant, it has to play in the space of containers, serverless, and the cloud
By 2022 90% of all new apps will feature micro-service architectures that will provide the ability to design, update and leverage 3rd party code
By 2022 35% of all production apps will be cloud native
By 2022 the top 4 clouds will host 90% of PaaS/IaaS deployments, while firms will work to avoid lock-in on 60% of their apps via multicloud - lead common denominator and cloud-native strategies.
(Source: IDC FutureScape: WorldWide IT Industry 2019 Predictions)
CF Wants to Be A Modern Platform
- Coud Native
- Microservice apps
Vision:
- Modernization
- Cloud
- Micros-services
Micro-service support
- Massive reduction in installer size
- new installer - 1 GB reduced to 50MB
- in that ZIP, you’ll have CF runtime as well as package mgr which knows how to get additional modules in
Modularity
- Breaking up CF into tiny modules
- Everything right now is baked in
- PDF could be 1 module, schedule could be 1 module, .NET integration could be 1, etc.
CommandLine Modularization
and GUI based installation
can do “list” in CLI, and it will list the modules available
if I try to use, say, scheduleler, it will alert me saying that module is not available if i haven’t installed it yet.
“install scheduler” from CLI, and it will be installed
“uninstall scheduler” from CLI, will uninstall it
Rollout:
Full blown
Code scan
Runtime check
Significant shift in how this is done currently
will have a full blown “install all the modules” install option if you want it
Code Scan - scan your app code, will make a config file with a list of modules that your code needs, so it installs all the appropriate modules, but not unused modules
Runtime Check - maybe, still deciding on this one
Configuration Tool
- CLI based tool
- All your settings in 1 JSON file - tomcat, JVM, neo-* xml files, etc.
- Show, set, add, list, import, export, transfer, diff - commands
- Docker images will honor the JSON file
Beyond CF 2020
- centralized config and administration
- not just CLI, the next step would be a centralized config
- instead of every server having it’s own CF Admin, have 1 Admin that manages all the nodes
- not just server settings, but app settings as well
- but not for CF 2020, maybe a later version
Cloud
- On AWS and Azure
- will have multi cloud common interface across various types of storage
- Storage
- Database
- NoSQL
- Caching
- Messages / notifications
- Storage:
AWS S3
Azure blog
storageService = cloudService( this.blogCred, this.blogConf );
list all the roots that storage service has
root => bucket (for s3
root = > container (for azure blob)
rootList = storageService.listAll();
get a root reference from authenticated storage service, it wont create a new root
filename = “c:\some path to a local.jpg” key = “key1”; root = storageService.root( “rootpoc” ); uploadRequest = { “srcfile” : filename, “key”: key }; uploadResponse = root.upoadfile( uploadRequest ); //list all keys in teh root keys = root.listAll(); WriteDump( keys ); // list all keys starting w/ prefix listRequest = { “prefix” : “foo” }; keys = root.listAll( listRequest ); writeDump( keys );
can also download a requested file, etc
NoSQL -
MongoDB
DynamoDB
modern interface for these coming, no longer will you have to use Java code to get to them
// retrieve database db = mongoService( “cosmos” ).db( “mydb” ); collection = db.collection; collection.drop(); collection.insert(); collection.insertMany(); collection.find().foreach(); collection.find().skip(1).limit(1).toArray(); // pass in a key and find the first entry available, etc collection.find().first(); collection.distinct(); collection.deleteOne(); collection.deleteMany(); collection.drop();
virtually all the mongo db functionally will get exposed and made available
// getting a Dynamo DB dymamo = cloudService( credentials, config ); // make yourTable Schema structs here // then just do dymamo.createTable( structOfTableSchma ); dynamo.putItem(); dynamo.getItem(); result = dynamo.query();
Messages / Notifications
- SQS - consumer/notification style service
- SNS - more of a pub/sub style, 1 thing that publishes, many subscribers
- Azure Service Bus - performs both of the above
SQS
sqs = cloudServie( this.credentials, this.config ); sqs.createQueue( “my queue” ); sqs.sendMessage( message ); sqs.receiveMessage( metadata ); sqs.deleteQueue( .getQueueURL() );
Azure
svcBus = cloudService( credentials, config ); svcBus.createQueye(); svcBus.sendMessage(); svcBus.receiveMessage(); svcBus.deleteQueye();
SNS
sns = cloudService( credentials, config ) sns.createTopic( meta data ); sns.listTopics(); sns.deleteTopic(); topic.subscribe( metadata for an email addy, a phone number, etc ); topic.publish();
anything subscribing will get a notification when that .publish() happens
Serverless
- Will have a tool in which you can build a Lambda runtime
- Wrap your code in Lambda and deploy on AWS Lambda
- build CF lambda runtime using the CF Packaged tool
Mondernization
- really interesting language improvements in the recent Update 5 pack:
- Some() and Every() functions for array, struct, query
- Array function - splice
- Query functions - append, prepend, new reverse, slice, insertAt
- Lambdas using arrow / fat arrow operator
CFScript 2.0 - new streamlined syntax
instead of
cfhttp( ... ) { cfHttpParam(); };
we can do:
new http( ... ).addParam( ... ).send();
Productivity
- CFML’s inherent ability - do more with less
- save setup time - scriptable config for server
- and more
Performance
- reduction in the start up time
- because CF 2020 is significantly modularized
- less than 5 seconds
- Nimble runtime - less resources and scale better
- will consume less memory, uses less resources, etc.
Security
Single sing-on support: SAML integration. Just use a couple functions to get that working:
if( isDefined( “form.saml_login” ) ) { relaystate = “page”; idp = {}; idp.name = “kta_url”; sp = {}; sp.name = “okta_url”; }
to get the authenticated name:
verifySAMLResponse().nameid;
will have a CF 2020 Alpha available soon
pre-release participation survey:
https://www.surveymonkey.com/r/CFPR2019