We are in the process of building a modern content platform to deliver our content through various channels. We decided to go with Microservices architecture as we wanted scale. Microservice architecture style is an approach to developing an application as a suite of small independently deployable services built around specific business capabilities. You can gain modularity, extensive parallelism and cost-effective scaling by deploying services across many distributed servers. Microservices modularity facilitates independent updates/deployments, and helps to avoid single point of failure, which can help prevent large-scale outages.\nWe also decided to use Event Driven Architecture pattern which is a popular distributed asynchronous architecture pattern used to produce highly scalable applications. The event-driven architecture is made up of highly decoupled, single-purpose event processing components that asynchronously receive and process events.\n\n

To build our #Backend capabilities we decided to use the following:\n1. #Microservices - Java with Spring Boot , Node.js with ExpressJS and Python with Flask \n2. #Eventsourcingframework - Amazon Kinesis , Amazon Kinesis Firehose , Amazon SNS , Amazon SQS, AWS Lambda \n3. #Data - Amazon RDS , Amazon DynamoDB , Amazon S3 , MongoDB Atlas \n\n

To build #Webapps we decided to use Angular 2 with RxJS \n\n

#Devops - GitHub , Travis CI , Terraform , Docker , Serverless ","rawContent":"We are in the process of building a modern content platform to deliver our content through various channels. We decided to go with Microservices architecture as we wanted scale. Microservice architecture style is an approach to developing an application as a suite of small independently deployable services built around specific business capabilities. You can gain modularity, extensive parallelism and cost-effective scaling by deploying services across many distributed servers. Microservices modularity facilitates independent updates/deployments, and helps to avoid single point of failure, which can help prevent large-scale outages.\nWe also decided to use Event Driven Architecture pattern which is a popular distributed asynchronous architecture pattern used to produce highly scalable applications. The event-driven architecture is made up of highly decoupled, single-purpose event processing components that asynchronously receive and process events.\n\nTo build our @{#Backend}|topic:491| capabilities we decided to use the following:\n1. @{#Microservices}|topic:513| - @{Java}|tool:995| with @{Spring Boot}|tool:2927| , @{Node.js}|tool:1011| with @{ExpressJS}|tool:1163| and @{Python}|tool:993| with @{Flask}|tool:1001| \n2. @{#Eventsourcingframework}|topic:890| - @{Amazon Kinesis}|tool:433| , @{Amazon Kinesis Firehose}|tool:3770| , @{Amazon SNS}|tool:396| , @{Amazon SQS}|tool:395|, @{AWS Lambda}|tool:1909| \n3. @{#Data}|topic:1360| - @{Amazon RDS}|tool:232| , @{Amazon DynamoDB}|tool:389| , @{Amazon S3}|tool:25| , @{MongoDB Atlas}|tool:5739| \n\nTo build @{#Webapps}|topic:920| we decided to use @{Angular 2}|tool:3745| with @{RxJS}|tool:1796| \n\n@{#Devops}|topic:402| - @{GitHub}|tool:27| , @{Travis CI}|tool:460| , @{Terraform}|tool:1276| , @{Docker}|tool:586| , @{Serverless}|tool:5095| \n","publishedAt":"2019-07-29T09:17:15Z","private":false,"sample":false,"commentsCount":1,"upvotesCount":19,"upvoted":false,"flagged":false,"bookmarked":false,"viewCount":4012269,"draft":false,"createdAt":"2019-07-29T09:17:18Z","decisionType":"freeform","answers({\"first\":2})":{"type":"id","generated":true,"id":"$StackDecision:102523983538702954.answers({\"first\":2})","typename":"StackDecisionConnection"},"subjectTools":[{"type":"id","generated":false,"id":"Tool:101231773669807419","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773636491087","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773410696721","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773970332063","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231775927452566","typename":"Tool"}],"fromTools":[],"toTools":[],"deleted":false,"link":null,"company":null,"stack":null,"topics":[{"type":"id","generated":true,"id":"StackDecision:102523983538702954.topics.0","typename":"Topic"},{"type":"id","generated":true,"id":"StackDecision:102523983538702954.topics.1","typename":"Topic"},{"type":"id","generated":true,"id":"StackDecision:102523983538702954.topics.2","typename":"Topic"},{"type":"id","generated":true,"id":"StackDecision:102523983538702954.topics.3","typename":"Topic"},{"type":"id","generated":true,"id":"StackDecision:102523983538702954.topics.4","typename":"Topic"},{"type":"id","generated":true,"id":"StackDecision:102523983538702954.topics.5","typename":"Topic"}],"services":[{"type":"id","generated":false,"id":"Tool:101231773840406851","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231776297440807","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773838011785","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231774666323920","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773845103618","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773920953695","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773837179153","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773632626053","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231775186090046","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773618592622","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773618167288","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231774215979427","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231775174055327","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231774170220209","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773410696721","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773636491087","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773970332063","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773669807419","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231775927452566","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773523090140","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773615579247","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773409399220","typename":"Tool"}],"user":{"type":"id","generated":false,"id":"User:101232084434873139","typename":"User"},"rootComments":[{"type":"id","generated":false,"id":"Comment:105637743014901193","typename":"Comment"}],"__typename":"StackDecision","parent":null},"$StackDecision:102523983538702954.permissions":{"edit":false,"delete":false,"__typename":"Permissions"},"$StackDecision:102523983538702954.answers({\"first\":2})":{"count":0,"pageInfo":{"type":"id","generated":true,"id":"$StackDecision:102523983538702954.answers({\"first\":2}).pageInfo","typename":"PageInfo"},"edges":[],"__typename":"StackDecisionConnection"},"$StackDecision:102523983538702954.answers({\"first\":2}).pageInfo":{"hasNextPage":false,"endCursor":null,"__typename":"PageInfo"},"Tool:101231773636491087":{"id":"101231773636491087","name":"Travis CI","slug":"travis-ci","title":"A hosted continuous integration service for open source and private projects","verified":true,"imageUrl":"https://img.stackshare.io/service/460/Lu6cGu0z_400x400.png","canonicalUrl":"/travis-ci","path":"/travis-ci","votes":1749,"fans":9389,"stacks":26381,"followingTool":false,"followContext":null,"__typename":"Tool"},"Tool:101231773970332063":{"id":"101231773970332063","name":"Terraform","slug":"terraform","title":"Describe your complete infrastructure as code and build resources across providers","verified":true,"imageUrl":"https://img.stackshare.io/service/1276/default_2316907c4199f912e2ed79cbdb99025c9e5e2665.png","canonicalUrl":"/terraform","path":"/terraform","votes":344,"fans":17532,"stacks":18401,"followingTool":false,"followContext":null,"__typename":"Tool"},"Tool:101231775927452566":{"id":"101231775927452566","name":"Serverless","slug":"serverless","title":"The most widely-adopted toolkit for building serverless applications","verified":false,"imageUrl":"https://img.stackshare.io/service/5095/serverless-logo.png","canonicalUrl":"/serverless","path":"/serverless","votes":26,"fans":1539,"stacks":1334,"followingTool":false,"followContext":null,"__typename":"Tool"},"StackDecision:102523983538702954.topics.0":{"name":"Backend","__typename":"Topic"},"StackDecision:102523983538702954.topics.1":{"name":"Microservices","__typename":"Topic"},"StackDecision:102523983538702954.topics.2":{"name":"Eventsourcingframework","__typename":"Topic"},"StackDecision:102523983538702954.topics.3":{"name":"Webapps","__typename":"Topic"},"StackDecision:102523983538702954.topics.4":{"name":"Devops","__typename":"Topic"},"StackDecision:102523983538702954.topics.5":{"name":"Data","__typename":"Topic"},"Tool:101231773840406851":{"id":"101231773840406851","name":"Flask","slug":"flask","title":"A microframework for Python based on Werkzeug, Jinja 2 and good intentions","verified":false,"imageUrl":"https://img.stackshare.io/service/1001/default_6d109315b60108628b7cd3e159b84645c31ef0e2.png","canonicalUrl":"/flask","path":"/flask","votes":66,"fans":19619,"stacks":19017,"followingTool":false,"followContext":null,"__typename":"Tool"},"Tool:101231776297440807":{"id":"101231776297440807","name":"MongoDB Atlas","slug":"mongodb-atlas","title":"Deploy and scale a MongoDB cluster in the cloud with just a few clicks","verified":true,"imageUrl":"https://img.stackshare.io/service/5739/atlas-360x360.png","canonicalUrl":"/mongodb-atlas","path":"/mongodb-atlas","votes":34,"fans":1151,"stacks":843,"followingTool":false,"followContext":null,"__typename":"Tool"},"Tool:101231774666323920":{"id":"101231774666323920","name":"Spring Boot","slug":"spring-boot","title":"Create Spring-powered, production-grade applications and services with absolute minimum fuss","verified":false,"imageUrl":"https://img.stackshare.io/service/2927/nPzvMuo2_400x400.png","canonicalUrl":"/spring-boot","path":"/spring-boot","votes":1012,"fans":27693,"stacks":25984,"followingTool":false,"followContext":null,"__typename":"Tool"},"Tool:101231773920953695":{"id":"101231773920953695","name":"ExpressJS","slug":"expressjs","title":"Sinatra inspired web development framework for node.js -- insanely fast, flexible, and simple","verified":false,"imageUrl":"https://img.stackshare.io/service/1163/hashtag.png","canonicalUrl":"/expressjs","path":"/expressjs","votes":1617,"fans":28982,"stacks":32025,"followingTool":false,"followContext":null,"__typename":"Tool"},"Tool:101231773632626053":{"id":"101231773632626053","name":"Amazon Kinesis","slug":"amazon-kinesis","title":"Store and process terabytes of data each hour from hundreds of thousands of sources","verified":false,"imageUrl":"https://img.stackshare.io/service/433/default_6bea44ee4da746fbb7c9070a7ffac9b764d1ed79.png","canonicalUrl":"/amazon-kinesis","path":"/amazon-kinesis","votes":9,"fans":758,"stacks":724,"followingTool":false,"followContext":null,"__typename":"Tool"},"Tool:101231775186090046":{"id":"101231775186090046","name":"Amazon Kinesis Firehose","slug":"amazon-kinesis-firehose","title":"Simple and Scalable Data Ingestion","verified":false,"imageUrl":"https://img.stackshare.io/service/3770/amazon-kinesis.png","canonicalUrl":"/amazon-kinesis-firehose","path":"/amazon-kinesis-firehose","votes":0,"fans":238,"stacks":234,"followingTool":false,"followContext":null,"__typename":"Tool"},"Tool:101231773618592622":{"id":"101231773618592622","name":"Amazon SNS","slug":"amazon-sns","title":"Fully managed push messaging service","verified":false,"imageUrl":"https://img.stackshare.io/service/396/amazon-sns.png","canonicalUrl":"/amazon-sns","path":"/amazon-sns","votes":18,"fans":1565,"stacks":1386,"followingTool":false,"followContext":null,"__typename":"Tool"},"Tool:101231773618167288":{"id":"101231773618167288","name":"Amazon SQS","slug":"amazon-sqs","title":"Fully managed message queuing service","verified":false,"imageUrl":"https://img.stackshare.io/service/395/amazon-sqs.png","canonicalUrl":"/amazon-sqs","path":"/amazon-sqs","votes":171,"fans":2513,"stacks":2237,"followingTool":false,"followContext":null,"__typename":"Tool"},"Tool:101231774215979427":{"id":"101231774215979427","name":"AWS Lambda","slug":"aws-lambda","title":"Automatically run code in response to modifications to objects in Amazon S3 buckets, messages in Kinesis streams, or updates in DynamoDB","verified":false,"imageUrl":"https://img.stackshare.io/service/1909/aws-lambda.png","canonicalUrl":"/aws-lambda","path":"/aws-lambda","votes":432,"fans":22856,"stacks":24025,"followingTool":false,"followContext":null,"__typename":"Tool"},"Tool:101231775174055327":{"id":"101231775174055327","name":"Angular","slug":"angular","title":"A platform for building mobile and desktop web applications","verified":false,"imageUrl":"https://img.stackshare.io/service/3745/cb8U-gL6_400x400.jpg","canonicalUrl":"/angular","path":"/angular","votes":499,"fans":5362,"stacks":1836,"followingTool":false,"followContext":null,"__typename":"Tool"},"Tool:101231774170220209":{"id":"101231774170220209","name":"RxJS","slug":"rxjs","title":"The Reactive Extensions for JavaScript","verified":false,"imageUrl":"https://img.stackshare.io/service/1796/984368.png","canonicalUrl":"/rxjs","path":"/rxjs","votes":21,"fans":1163,"stacks":2127,"followingTool":false,"followContext":null,"__typename":"Tool"},"Tool:101231773523090140":{"id":"101231773523090140","name":"Amazon RDS","slug":"amazon-rds","title":"Set up, operate, and scale a relational database in the cloud.","verified":false,"imageUrl":"https://img.stackshare.io/service/232/amazon-rds.png","canonicalUrl":"/amazon-rds","path":"/amazon-rds","votes":761,"fans":13710,"stacks":15840,"followingTool":false,"followContext":null,"__typename":"Tool"},"Tool:101231773615579247":{"id":"101231773615579247","name":"Amazon DynamoDB","slug":"amazon-dynamodb","title":"Fully managed NoSQL database service","verified":false,"imageUrl":"https://img.stackshare.io/service/389/amazon-dynamodb.png","canonicalUrl":"/amazon-dynamodb","path":"/amazon-dynamodb","votes":195,"fans":4020,"stacks":3709,"followingTool":false,"followContext":null,"__typename":"Tool"},"Tool:101231773409399220":{"id":"101231773409399220","name":"Amazon S3","slug":"amazon-s3","title":"Store and retrieve any amount of data, at any time, from anywhere on the web","verified":false,"imageUrl":"https://img.stackshare.io/service/25/amazon-s3.png","canonicalUrl":"/amazon-s3","path":"/amazon-s3","votes":2041,"fans":47910,"stacks":53229,"followingTool":false,"followContext":null,"__typename":"Tool"},"Comment:105637743014901193":{"id":"105637743014901193","content":"But why not just use Contentful?","postedAt":"2021-01-29T07:07:17Z","upvoted":false,"flagged":false,"upvotesCount":0,"parentId":null,"user":{"type":"id","generated":false,"id":"User:105637722077505819","typename":"User"},"__typename":"Comment","replies":[]},"User:105637722077505819":{"id":"105637722077505819","path":"/jon7680","imageUrl":"https://img.stackshare.io/user/864106/default_59b9b6036e9c1ba1da79d65f425676a13c792fb0.jpg","displayName":"Jon Senterfitt","__typename":"User"}}

Engineering Manager at Taylor and Francis·

We are in the process of building a modern content platform to deliver our content through various channels. We decided to go with Microservices architecture as we wanted scale. Microservice architecture style is an approach to developing an application as a suite of small independently deployable services built around specific business capabilities. You can gain modularity, extensive parallelism and cost-effective scaling by deploying services across many distributed servers. Microservices modularity facilitates independent updates/deployments, and helps to avoid single point of failure, which can help prevent large-scale outages. We also decided to use Event Driven Architecture pattern which is a popular distributed asynchronous architecture pattern used to produce highly scalable applications. The event-driven architecture is made up of highly decoupled, single-purpose event processing components that asynchronously receive and process events.

To build our #Backend capabilities we decided to use the following: 1. #Microservices - Java with Spring Boot , Node.js with ExpressJS and Python with Flask 2. #Eventsourcingframework - Amazon Kinesis , Amazon Kinesis Firehose , Amazon SNS , Amazon SQS, AWS Lambda 3. #Data - Amazon RDS , Amazon DynamoDB , Amazon S3 , MongoDB Atlas

To build #Webapps we decided to use Angular 2 with RxJS

#Devops - GitHub , Travis CI , Terraform , Docker , Serverless

READ LESS
19 upvotes·1 comment·4M views
Jon Senterfitt
Jon Senterfitt
·
January 29th 2021 at 7:07AM

But why not just use Contentful?

·
Reply
Avatar of Praveen Mooli

Praveen Mooli

Engineering Manager at Taylor and Francis