apidays LIVE Australia 2020 - Strangling the monolith with a reactive GraphQL gateway by Martin Varga
MARTIN VARGA | SOFTWARE DEVELOPER | @MARTINTEEVARGA
Strangling the monolith
with a reactive GraphQL gateway
STRANGLING THE MONOLITH
WITH A REACTIVE GRAPHQL
GATEWAY
MONOLITH?
Plan, track and
release software.
JIRA SOFTWARE
apidays LIVE Australia 2020 - Strangling the monolith with a reactive GraphQL gateway by Martin Varga
The Story of Jira
From the developer’s perspective
Server Cloud
1001001
0 0 1 0 0 1
0 0 1 0 0 1
1101010
1010101
0 0 1 0 0 1
1110001001
0011110010
1100101011
01111110001
Single Code Base
Server Cloud
1001001
0 0 1 0 0 1
0 0 1 0 0 1
1101010
1010101
0 0 1 0 0 1
1101010
1010101
0 0 1 0 0 1
1101010
1010101
0 0 1 0 0 1
1101010
1010101
0 0 1 0 0 1
11010101010101
0010010101001
00101010111010
1010101010010
0101010010010
10101110101010
110101010101010010010101
001001010101110101010101
010010010101001001010101
110101010101010010010101
001001010101110101010101
010010010101001001010101
110101010101010010010101
001001010101110101010101
010010010101001001010101
110101010101010010010101
001001010101110101010101
apidays LIVE Australia 2020 - Strangling the monolith with a reactive GraphQL gateway by Martin Varga
110101010101010010010101
001001010101110101010101
010010010101001001010101
110101010101010010010101
001001010101110101010101
010010010101001001010101
110101010101010010010101
001001010101110101010101
010010010101001001010101
110101010101010010010101
001001010101110101010101
110101010101010010010101
001001010101110101010101
010010010101001001010101
110101010101010010010101
001001010101110101010101
010010010101001001010101
110101010101010010010101
001001010101110101010101
010010010101001001010101
110101010101010010010101
001001010101110101010101
110101010101010010010101
001001010101110101010101
010010010101001001010101
110101010101010010010101
001001010101110101010101
010010010101001001010101
110101010101010010010101
001001010101110101010101
010010010101001001010101
110101010101010010010101
001001010101110101010101
1101010101010100
1001010100100101
0101110101010101
010010010101001
0010101011101010
1010101001001010
1001001010101110
1 0 1 0 1 0
1010111
001001
1101010101
010100100
101010010
0101010111
0 1 0 1 0 1
1011100
1 0 0 1 0 1
1 0 1 0 1 0
1010111
001001
1101010
1010101
001001
0 1 0 1 0 1
1011100
1 0 0 1 0 1
1 0 1 0 1 0
1010111
001001
0 1 0 1 0 1
1011100
1 0 0 1 0 1
1101010
1010101
001001
0 1 0 1 0 1
1011100
1 0 0 1 0 1
1 0 1 0 1 0
1010111
001001
0 1 0 1 0 1
1011100
1 0 0 1 0 1
apidays LIVE Australia 2020 - Strangling the monolith with a reactive GraphQL gateway by Martin Varga
How Atlassian builds services
Making developers productive with platform as a service
PaaS that allows
devs to create and
deploy a service in
matter of minutes.
MICROS
MICROS
name: "animalfacts"
compose:
animalfacts:
image: internal.docker.repo/animalfacts
tag: 'PROJECT_VERSION'
ports:
- 8080:8080
MICROS DESCRIPTOR
links:
healthcheck:
uri: heartbeat
port: 8080
source:
url: "git@bitbucket.org:atlassianlabs/animal-facts-
graphql-gateway-demo.git"
notifications:
email: "animalfactsowner@atlassian.com"
resources:
- type: dynamo-db
name: facts
attributes:
ReadWriteCapacityMode: ON_DEMAND
Jira Software Tech Stack
DynamoDB or PostgreSQL
Depends on the application.
Project Reactor
Mature reactive library.
Kotlin
For all new services.
Spring Boot
Custom wrapper that makes
monitoring etc. easier.
A case for a reactive gateway
A real world example
LATENCY
250ms
250ms
250ms
750ms
LATENCY
10ms250ms
10ms
10ms
280ms
MIGRATION
Legacy
Modern
MIGRATION
Legacy
Modern
Strangler
Isolate front-end and back-end changes, dark traffic,
comparisons.
Minimum business logic
Keep it light, no-code configuration could be enough.
Fully stateless
Scales (almost) indefinitely.
Operators
Useful for modifying and combining sources.
Allows composition of libraries that add
resilience, tracing etc.
Async
Calls a service, then does mostly nothing and
waits. Perfect fit.
Project
reactor
Clean code
No callback hell.
val currentBoard = “5”.toMono()
MONO
5
val recentBoards = listOf("0", "1", "2").toFlux()
FLUX
0 1 2
val currentBoard = "5".toMono()
val recentBoards = listOf("0", "1", "2").toFlux()
currentBoard.concatWith(recentBoards)
COMPOSITION & CLEAN CODE
5
0 1 2
0 1 25
val currentBoard = "5".toMono()
val recentBoards = listOf("0", "1", "2").toFlux()
currentBoard.concatWith(recentBoards)
.map {
boardService.getName(it)
}
.take(3)
.subscribe {
println(it)
}
COMPOSITION & CLEAN CODE
Surfboard
Skateboard
Ironing board
COMPOSITION & CLEAN CODE
currentBoard.concatWith(recentBoards)
.map {
boardService.getName(it)
}
.timeout(Duration.ofMillis(2500))
.onErrorReturn("Recent board”)
.take(3)
.subscribe {
println(it)
}
COMPOSITION & CLEAN CODE
Surfboard
Recent board
Ironing board
COMPOSITION & CLEAN CODE
val currentBoard = currentBoardServiceMono()
val recentBoards = recentBoardsServiceFlux()
return currentBoard.concatWith(recentBoards)
.map {
boardService.getName(it)
}
.timeout(Duration.ofMillis(2500))
.onErrorReturn("Recent board”)
.take(3)
REAL WORLD EXAMPLE
Get exactly what you want
Query multiple sources at once, specify what you
want.
Strongly typed schema
Schema is a living documentation.
Mature web clients
Clients like Apollo let us remove dependency on
Redux in ReactJs web apps.
GraphQL
type Query {
board(id: ID): Board
}
type Board {
id: ID
name: String
issues: [Issue]
}
type Issue {
id: ID
key: String
}
SCHEMA
POST /jsw/graphql
query {
board(id: 42) {
name
issues {
key
}
}
}
QUERY
{
"data": {
"board": {
"name": "Software board”
"issues": [
{
"key": "KEY-1"
}
]
}
}
}
RESPONSE
Project Reactor + GraphQL Java
OUR SOLUTION
Let’s write some code
Fully working GraphQL gateway
GET https://catfact.ninja/fact
{
"fact": "The leopard is the most widespread of all big
cats.",
"length": 51
}
CAT FACTS API
GET https://some-random-api.ml/facts/dog
{
"fact": "A dogs' first sense to develop is touch."
}
DOG FACTS API
Cat Facts
Dog Facts
WHY NOT BOTH?
POST https://animalfactsgateway.com/grapqhl
query {
dog {
fact
length
}
cat {
fact
length
}
}
ANIMAL FACTS GRAPHQL API
{
"data": {
"dog": {
"fact": "Dog fact",
"length": 8
},
"cat": {
"fact": "Cat fact",
"length": 8
}
}
}
dependencies {
implementation("org.springframework.boot:spring-boot-
starter-webflux")
implementation("com.fasterxml.jackson.module:jackson-
module-kotlin")
implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
implementation("com.graphql-java:graphql-java:11.0")
}
package com.atlassian.jsw.factsdemo
import o.s.b.autoconfigure.SpringBootApplication
import o.s.b.runApplication
@SpringBootApplication
class DemoApplication
fun main(args: Array<String>) {
runApplication<DemoApplication>(*args)
}
APPLICATION
type Query {
cat: Fact
dog: Fact
}
type Fact {
fact: String
length: Int
}
GRAPHQL SCHEMA
interface FactFetcher: DataFetcher<CompletionStage<Fact?>>
FETCHERS
public interface DataFetcher<T> {
T get(DataFetchingEnvironment env) throws Exception;
}
data class Fact(val fact: String, val length: Int)
FACT CLASS
@Component
class CatFactFetcher(val webClient: WebClient) :
FactFetcher {
override fun get(environment:
DataFetchingEnvironment): CompletionStage<Fact?> =
webClient.get().uri("https://catfact.ninja/fact")
.retrieve()
.bodyToMono(CatFact::class.java)
.map { Fact(it.fact, it.length) }
.toFuture()
}
data class CatFact(val fact: String, val length: Int)
CAT FACTS FETCHER
@Component
class DogFactFetcher(val webClient: WebClient) :
FactFetcher {
override fun get(environment:
DataFetchingEnvironment): CompletionStage<Fact?> =
webClient.get().uri("https://.../facts/dog")
.retrieve()
.bodyToMono(DogFact::class.java)
.map { Fact(it.fact, it.fact.length) }
.toFuture()
}
data class DogFact(val fact: String)
DOG FACTS FETCHER
@Configuration
class GraphqlConfig {
@Bean
fun schema(wiring: RuntimeWiring): GraphQLSchema =
SchemaGenerator().makeExecutableSchema(
parseSchema(“/graphql/schema.graphqls"),
wiring
)
}
GRAPHQL CONFIGURATION
@Configuration
class GraphqlConfig {
@Bean
fun factsWiring(
dogFactFetcher: DogFactFetcher,
catFactFetcher: CatFactFetcher
): RuntimeWiring =
RuntimeWiring.newRuntimeWiring()
.type(
newTypeWiring("Query")
.dataFetcher("dog", dogFactFetcher)
.dataFetcher("cat", catFactFetcher)
)
.build()
}
override fun processQuery(
query: String
): Mono<ExecutionResult> = Mono.fromFuture(
GraphQL
.newGraphQL(graphQLSchema)
.build()
.executeAsync(
ExecutionInput.newExecutionInput()
.query(query)
.build()
)
)
SERVICE METHOD
@PostMapping(
path = ["/graphql"],
consumes = [MediaType.APPLICATION_JSON_VALUE],
produces = [MediaType.APPLICATION_JSON_VALUE]
)
fun graphql(
@RequestBody body: Map<String, Any>
): Mono<Map<String, Any>> {
val query: String = body["query"] as String? ?: "{}"
return graphQLService.processQuery(query)
.map { it.toSpecification() }
}
REACTIVE API
{
"data": {
"dog": {
"fact": "“Him” and “Her” were the names of President
Lyndon Johnson's two beagles.",
"length": 73
},
"cat": {
"fact": "Jaguars are the only big cats that don't
roar.",
"length": 46
}
}
}
RESULT
Resilience
Protect the downstream services from the upstream.
🐕 🐈250ms 380ms
380ms
CAT FACTS BROKEN
🐈🚫🐕250ms 30s
30s
{
"data": {
"dog": {…},
"cat": null
},
"errors": [
{
"message": "Exception while fetching data (/cat) :
Operation timed out",
"path": [
"cat"
]
}
]
}
TIMEOUT
🐈🚫🐕250ms 5000ms
5000ms
class CatFactFetcher(
val webClient: WebClient
) : FactFetcher {
override fun get(environment:
DataFetchingEnvironment): CompletionStage<Fact?> =
webClient.get().uri("https://catfact.ninja/fact")
.retrieve()
.bodyToMono(CatFact::class.java)
.map { … }
.timeout(Duration.ofMillis(5000))
.toFuture()
}
CAT FACTS WITH TIMEOUT
{
"data": {
"dog": {…},
"cat": null
},
"errors": [
{
"message": "Exception while fetching data (/cat) :
Did not observe any item or terminal signal within 5000ms
in 'map' (and no fallback has been configured)",
"path": [
“cat"
]
}
]
}
CIRCUIT BREAKER
🐈🚫🐕250ms 0ms
250ms
CIRCUIT BREAKER
Closed
OpenHalf-open
🐈🚫
class CatFactFetcher(
val webClient: WebClient,
val catBreaker: CircuitBreaker
) : FactFetcher {
override fun get(environment:
DataFetchingEnvironment): CompletionStage<Fact?> =
webClient.get()

…
.timeout(Duration.ofMillis(2500))
.transform(
CircuitBreakerOperator.of(catBreaker)
)
.toFuture()
}
CAT FACTS FETCHER WITH CIRCUIT BREAKER
@Bean
fun catCircuitBreaker(): CircuitBreaker {
val circuitBreakerConfig =
CircuitBreakerConfig.custom()
.ringBufferSizeInClosedState(3)
.ringBufferSizeInHalfOpenState(3)
.waitDurationInOpenState(Duration.ofMillis(5000))
.failureRateThreshold(0.5f)
.build()
return circuitBreakerRegistry.circuitBreaker(
"CatCCB",
circuitBreakerConfig
)
}
{
"data": {
"dog": {…},
"cat": null
},
"errors": [
{
"message": "Exception while fetching data (/cat) :
CircuitBreaker 'CatCCB' is OPEN and does not permit
further calls",
"path": [
"cat"
]
}
]
}
CIRCUIT BREAKER
🐈🚫🐕250ms 0ms
250ms
But we might miss some cat facts.
Takeaways
Even if you forget everything else I said, please try…
GraphQL
For APIs consumed from the front-end.
Resilience
To prevent propagating errors downstream.
Reactive
For I/O heavy apps.
Takeaways
Resources
Write your own reactive and resilient GraphQL gateway in Kotlin
1
2
3
Animal Facts GraphQL Gateway
https://bitbucket.org/atlassianlabs/animal-facts-graphql-gateway-demo/src/
master/
graphql-java
https://www.graphql-java.com/
Resilience4j
https://github.com/resilience4j/resilience4j
Resources / Code
4 GraphiQL
https://github.com/graphql/graphiql
Resources / Code
1
2
Engineering stateless, high-availability cloud services at Atlassian
Atlassian Engineering Blog:
https://www.atlassian.com/blog/technology/aws-scaling-multi-region-low-latency-
service
More about Micros
Slightly outdated, but still relevant.

https://www.youtube.com/watch?v=dc2nqzgqH24
Resources / Further information
1 Why not both?
https://knowyourmeme.com/memes/why-not-both-why-dont-we-have-both
Resources / Other
2 We are hiring!
Jira Software is looking for engineers, Java and Kotlin
http://go.atlassian.com/jsw-hiring
MARTIN VARGA | SOFTWARE DEVELOPER | @MARTINTEEVARGA
Strangling the monolith
with a reactive GraphQL gateway
apidays LIVE Australia 2020 - Strangling the monolith with a reactive GraphQL gateway by Martin Varga

More Related Content

PDF
Rxjava meetup presentation
PPTX
Introduction to rx java for android
PPTX
Akka.NET streams and reactive streams
PPTX
2 презентация rx java+android
PDF
RxJS Operators - Real World Use Cases (FULL VERSION)
PPTX
Behind modern concurrency primitives
PDF
Practical RxJava for Android
PPTX
Angular2 rxjs
Rxjava meetup presentation
Introduction to rx java for android
Akka.NET streams and reactive streams
2 презентация rx java+android
RxJS Operators - Real World Use Cases (FULL VERSION)
Behind modern concurrency primitives
Practical RxJava for Android
Angular2 rxjs

What's hot (20)

PDF
RxJava applied [JavaDay Kyiv 2016]
PDF
Reactive programming with RxJS - ByteConf 2018
PDF
Dagger & rxjava & retrofit
PDF
(Even more) Rapid App Development with RubyMotion
PDF
ReactiveCocoa workshop
PPTX
Joker 2015 - Валеев Тагир - Что же мы измеряем?
PDF
Use deep learning to hack captcha
PPTX
RxJava Applied
PPTX
Async Best Practices
PDF
OSGi World Congress Workshop Exercise - P Kriens
PPTX
Java practice programs for beginners
PPTX
Async best practices DotNet Conference 2016
PDF
«Продакшн в Kotlin DSL» Сергей Рыбалкин
PDF
GDG DevFest 2015 - Reactive approach for slowpokes
PDF
Functional Stream Processing with Scalaz-Stream
PDF
The Ring programming language version 1.5.2 book - Part 74 of 181
PDF
The Ring programming language version 1.4 book - Part 21 of 30
PDF
RxJS Operators - Real World Use Cases - AngularMix
PDF
FS2 for Fun and Profit
PDF
JavaOne 2013: Java 8 - The Good Parts
RxJava applied [JavaDay Kyiv 2016]
Reactive programming with RxJS - ByteConf 2018
Dagger & rxjava & retrofit
(Even more) Rapid App Development with RubyMotion
ReactiveCocoa workshop
Joker 2015 - Валеев Тагир - Что же мы измеряем?
Use deep learning to hack captcha
RxJava Applied
Async Best Practices
OSGi World Congress Workshop Exercise - P Kriens
Java practice programs for beginners
Async best practices DotNet Conference 2016
«Продакшн в Kotlin DSL» Сергей Рыбалкин
GDG DevFest 2015 - Reactive approach for slowpokes
Functional Stream Processing with Scalaz-Stream
The Ring programming language version 1.5.2 book - Part 74 of 181
The Ring programming language version 1.4 book - Part 21 of 30
RxJS Operators - Real World Use Cases - AngularMix
FS2 for Fun and Profit
JavaOne 2013: Java 8 - The Good Parts
Ad

Similar to apidays LIVE Australia 2020 - Strangling the monolith with a reactive GraphQL gateway by Martin Varga (20)

PPTX
GraphQL - The new "Lingua Franca" for API-Development
PDF
GraphQL and its schema as a universal layer for database access
PDF
GraphQL with .NET Core Microservices.pdf
PDF
Graphql
PPTX
Introduction to GraphQL Presentation.pptx
PDF
Building Fullstack Serverless GraphQL APIs In The Cloud
PDF
LF_APIStrat17_Breaking a Monolith: In-Place Refactoring with Service-Oriented...
PDF
Breaking a monolith: In-place refactoring with service-oriented architecture ...
PDF
Reactor 3.0, a reactive foundation for java 8 and Spring
PDF
GraphQL across the stack: How everything fits together
PDF
Intro to GraphQL
PDF
Evolution of the Graph Schema
PDF
PPTX
Introduction to GraphQL
PDF
Dev sum - Beyond REST with GraphQL in .Net
PDF
Let's start GraphQL: structure, behavior, and architecture
PDF
Managing GraphQL servers with AWS Fargate & Prisma Cloud
PPTX
GraphQL Summit 2019 - Configuration Driven Data as a Service Gateway with Gra...
PPTX
GraphQL - an elegant weapon... for more civilized age
PDF
Nick Raienko ''Service-oriented GraphQL''
GraphQL - The new "Lingua Franca" for API-Development
GraphQL and its schema as a universal layer for database access
GraphQL with .NET Core Microservices.pdf
Graphql
Introduction to GraphQL Presentation.pptx
Building Fullstack Serverless GraphQL APIs In The Cloud
LF_APIStrat17_Breaking a Monolith: In-Place Refactoring with Service-Oriented...
Breaking a monolith: In-place refactoring with service-oriented architecture ...
Reactor 3.0, a reactive foundation for java 8 and Spring
GraphQL across the stack: How everything fits together
Intro to GraphQL
Evolution of the Graph Schema
Introduction to GraphQL
Dev sum - Beyond REST with GraphQL in .Net
Let's start GraphQL: structure, behavior, and architecture
Managing GraphQL servers with AWS Fargate & Prisma Cloud
GraphQL Summit 2019 - Configuration Driven Data as a Service Gateway with Gra...
GraphQL - an elegant weapon... for more civilized age
Nick Raienko ''Service-oriented GraphQL''
Ad

More from apidays (20)

PDF
apidays Munich 2025 - The Physics of Requirement Sciences Through Application...
PDF
apidays Munich 2025 - Developer Portals, API Catalogs, and Marketplaces, Miri...
PDF
apidays Munich 2025 - Making Sense of AI-Ready APIs in a Buzzword World, Andr...
PDF
apidays Munich 2025 - Integrate Your APIs into the New AI Marketplace, Senthi...
PDF
apidays Munich 2025 - The Double Life of the API Product Manager, Emmanuel Pa...
PDF
apidays Munich 2025 - Let’s build, debug and test a magic MCP server in Postm...
PDF
apidays Munich 2025 - The life-changing magic of great API docs, Jens Fischer...
PDF
apidays Munich 2025 - Automating Operations Without Reinventing the Wheel, Ma...
PDF
apidays Munich 2025 - Geospatial Artificial Intelligence (GeoAI) with OGC API...
PPTX
apidays Munich 2025 - GraphQL 101: I won't REST, until you GraphQL, Surbhi Si...
PPTX
apidays Munich 2025 - Effectively incorporating API Security into the overall...
PPTX
apidays Munich 2025 - Federated API Management and Governance, Vince Baker (D...
PPTX
apidays Munich 2025 - Agentic AI: A Friend or Foe?, Merja Kajava (Aavista Oy)
PPTX
apidays Munich 2025 - Streamline & Secure LLM Traffic with APISIX AI Gateway ...
PPTX
apidays Munich 2025 - Building Telco-Aware Apps with Open Gateway APIs, Subhr...
PPTX
apidays Munich 2025 - Building an AWS Serverless Application with Terraform, ...
PDF
apidays Helsinki & North 2025 - REST in Peace? Hunting the Dominant Design fo...
PDF
apidays Helsinki & North 2025 - Monetizing AI APIs: The New API Economy, Alla...
PDF
apidays Helsinki & North 2025 - How (not) to run a Graphql Stewardship Group,...
PDF
apidays Helsinki & North 2025 - APIs in the healthcare sector: hospitals inte...
apidays Munich 2025 - The Physics of Requirement Sciences Through Application...
apidays Munich 2025 - Developer Portals, API Catalogs, and Marketplaces, Miri...
apidays Munich 2025 - Making Sense of AI-Ready APIs in a Buzzword World, Andr...
apidays Munich 2025 - Integrate Your APIs into the New AI Marketplace, Senthi...
apidays Munich 2025 - The Double Life of the API Product Manager, Emmanuel Pa...
apidays Munich 2025 - Let’s build, debug and test a magic MCP server in Postm...
apidays Munich 2025 - The life-changing magic of great API docs, Jens Fischer...
apidays Munich 2025 - Automating Operations Without Reinventing the Wheel, Ma...
apidays Munich 2025 - Geospatial Artificial Intelligence (GeoAI) with OGC API...
apidays Munich 2025 - GraphQL 101: I won't REST, until you GraphQL, Surbhi Si...
apidays Munich 2025 - Effectively incorporating API Security into the overall...
apidays Munich 2025 - Federated API Management and Governance, Vince Baker (D...
apidays Munich 2025 - Agentic AI: A Friend or Foe?, Merja Kajava (Aavista Oy)
apidays Munich 2025 - Streamline & Secure LLM Traffic with APISIX AI Gateway ...
apidays Munich 2025 - Building Telco-Aware Apps with Open Gateway APIs, Subhr...
apidays Munich 2025 - Building an AWS Serverless Application with Terraform, ...
apidays Helsinki & North 2025 - REST in Peace? Hunting the Dominant Design fo...
apidays Helsinki & North 2025 - Monetizing AI APIs: The New API Economy, Alla...
apidays Helsinki & North 2025 - How (not) to run a Graphql Stewardship Group,...
apidays Helsinki & North 2025 - APIs in the healthcare sector: hospitals inte...

Recently uploaded (20)

PPTX
O2C Customer Invoices to Receipt V15A.pptx
PDF
Enhancing emotion recognition model for a student engagement use case through...
PDF
Assigned Numbers - 2025 - Bluetooth® Document
PDF
WOOl fibre morphology and structure.pdf for textiles
PDF
Hindi spoken digit analysis for native and non-native speakers
PDF
August Patch Tuesday
PDF
CloudStack 4.21: First Look Webinar slides
PPTX
Tartificialntelligence_presentation.pptx
PDF
Getting Started with Data Integration: FME Form 101
PDF
A novel scalable deep ensemble learning framework for big data classification...
PDF
1 - Historical Antecedents, Social Consideration.pdf
PDF
A contest of sentiment analysis: k-nearest neighbor versus neural network
PDF
Transform Your ITIL® 4 & ITSM Strategy with AI in 2025.pdf
PPTX
MicrosoftCybserSecurityReferenceArchitecture-April-2025.pptx
PDF
Taming the Chaos: How to Turn Unstructured Data into Decisions
PDF
Hybrid horned lizard optimization algorithm-aquila optimizer for DC motor
PPT
Geologic Time for studying geology for geologist
PPTX
Chapter 5: Probability Theory and Statistics
PDF
Microsoft Solutions Partner Drive Digital Transformation with D365.pdf
PPTX
Group 1 Presentation -Planning and Decision Making .pptx
O2C Customer Invoices to Receipt V15A.pptx
Enhancing emotion recognition model for a student engagement use case through...
Assigned Numbers - 2025 - Bluetooth® Document
WOOl fibre morphology and structure.pdf for textiles
Hindi spoken digit analysis for native and non-native speakers
August Patch Tuesday
CloudStack 4.21: First Look Webinar slides
Tartificialntelligence_presentation.pptx
Getting Started with Data Integration: FME Form 101
A novel scalable deep ensemble learning framework for big data classification...
1 - Historical Antecedents, Social Consideration.pdf
A contest of sentiment analysis: k-nearest neighbor versus neural network
Transform Your ITIL® 4 & ITSM Strategy with AI in 2025.pdf
MicrosoftCybserSecurityReferenceArchitecture-April-2025.pptx
Taming the Chaos: How to Turn Unstructured Data into Decisions
Hybrid horned lizard optimization algorithm-aquila optimizer for DC motor
Geologic Time for studying geology for geologist
Chapter 5: Probability Theory and Statistics
Microsoft Solutions Partner Drive Digital Transformation with D365.pdf
Group 1 Presentation -Planning and Decision Making .pptx

apidays LIVE Australia 2020 - Strangling the monolith with a reactive GraphQL gateway by Martin Varga