 So it's back up I take it out Okay All right What are you speaking on I'm doing transactions for microservices. Ah, I really like to see that. I uh Fortunately that I travel like all the time the solutions are okay, all right, and I made a completely rookie mistake It booked myself in two cities today Yeah, really, so I am headed to London right after this Cab and go into the airport Can I use can I switch out the cables was that I'm is that not a good thing to do? Okay, yeah, yeah, probably you Gosh, yeah, so who's heard of reactive pro who's done reactive programming before Anybody one guy. Yeah, I can't do sorry Verdex counts in fact, I even have Verdex stickers Alright, so is that on Okay, is that on Got a decent sound level back there. I'm pretty loud anyway, so I don't know Yeah, so I have Verdex stickers for your laptop if you need some some stickers for your laptop here We can pass these around when I come to the Verdex section Because you want your laptop, you know, you we have a lot of stickers out front to the plaster your laptop here There you go So one Verdex you or any other Verdex users or Rx Java or Rx. Yes. Yeah So while we're killing time so so tell me why are we have five we have like three minutes before we start So why are you why are you interested in this topic today two minutes two minutes to go? So why are you guys interested in this topic today? Okay, who else why are you why are you interested in it? All right, excellent I'll just call for two minutes and I'll talk till we start And Sarah Jane you want to come up here? Yeah, and you'll give me the thumbs up right when ready to go Oh, we're ready to go. We don't have to go ahead and start. Oh, I'm sorry. You give me that All right, sorry Good afternoon, welcome to the session. This is called get reactive programming systems micro services sticker is Jeremy Davis Is a principal solution architect for up there before joining that having me wrote a lot of code and javascript Python Objective C and of course Java That has micro services community practice Welcome. Thank you All right. Thank you for joining my talk about reactive I've given this talk or a variation on this talk a number of times It usually runs longer than 35 minutes So I'm gonna go really quick But feel free to interrupt all right I absolutely I love when people interrupt and I have stickers I'll give you a sticker early if you interrupt me and ask questions right so audience participation is highly encouraged Yeah, please Give me like 10 minutes 10 minutes and we'll make sure we're going through stuff So and so you just got a good bit of my background here I'd start it out as a as a dot-com web monkey. That's when I began my career all on front end I'm doing a lot of javascript. This is the last time I was at Boston University my father was a professor here and That's probably the last time I was on ice skates because after we left Boston went to South Carolina Where you don't get a lot of opportunity to get on ice skates, right? But I have skated at the Boston University ice rink a decade or three or so ago So we're gonna start off and you guys will have I really wanted you guys to have my email address and Twitter handle So these will be available. I'll put them out on slide shares and they'll be available from the conference as well So we're gonna start first of all of why this matters, right? It's a couple people said they're already using some reactive toolkits or interested in the topic of heard of it And I'm gonna give you a little bit of different angle. I think the user experience is why? reactive matters Now this guy's a user experience guru, but I have colleagues who are user experience gurus as well And so I asked Sarah Jane who you can find out here to sort to kick us off talking about what red hat does around UX My name is Sarah Jane Clark and I'm on Red Hat's user experience design team. I'm the lead user experience researcher on developer focus products Which is why we're here today and what we're doing in our booth out here are actual usability tests So we have four products that we're looking at including pattern fly which is our design system OpenShift.io OpenShift and The new developer website and what we're trying to do is get feedback because that feedback is what helps the designers know How to design the products so? It's super important for us to understand what's important to you what isn't important to you And what you think about about our products, so that's the feedback we're getting we have all kinds of goodies So if you have five minutes for me, I would love to hear your feedback Thank you, and so who writes front-end code? Couple people who writes back-end code Everybody right anyway, so now we'll go to the normally when we talk about user experience We talk about the front-end right that's what we think about it turns about layout and design and navigation But this guy and then this guy early on Jacob Nielsen I mentioned I started as a dot-com web monkey right and this guy was like the guru at the turn of the century This guy was the guru around web design, which was kind of amusing because the guy's website was completely boring I was just taxed but he was the guru right? But he has these three numbers and he started his career at I think IBM in his career doing mainframe usability I know that's kind of an oxymoron right, but he did mainframe usability And then he did at Sun Microsystems did like fat client stuff and then moved on to the web when the web was taking off and now Does mobile and web consultancy and he has these three numbers point one one and ten and this is all relates to How you feel something is responding in point one second You feel like you're interacting actively with your application whether it's a website or whether it's moving your mouse around Or or using your clicky or whatever it is at one second you begin to notice a lag So if I were to click this and it took a second for that slide to change or if I click a button on a web page And it takes a second you begin to notice a lag, but it's okay at about 10 seconds You're gonna abandon what you're doing and this is why you get you know the spinning beach ball of death on a Mac or why you get you know icons on a website that tells you something's happening right because giving you feedback saying you know hang on wait and The interesting thing about this is these numbers he I mentioned he started off doing mainframe We did fat client stuff did web mobile these numbers have stayed the same across all those paradigms So there's something that's uniquely human about these numbers right and if we write back-end code We have to deal with this because we have to get a response to our users inside of these time frames and Reactive is responsive, and so that's why we started with user experience and and being able to deliver right There are also interesting fun tools, and we're gonna look at several of these tools I'm assuming that most people have heard of at least no JS some of these others are probably going to be new Vertex is a red hat project I have Vertex stickers up here, and we've got some some Vertex stickers out there as well And we'll take a dive into Vertex Aka and and react to actually four technologies Four technologies in 35 minutes or 30 minutes All right, so we're covering really three topics But the two big ones are reactive systems in reactive programming and then we'll talk about how those feed into microservices architecture Where they make a lot of sense And we're gonna do both programming and systems right so this programming might look a little weird Hopefully it won't look too weird in just a few minutes, and this is this is about reactive systems This comes from the reactive manifesto, which is a manifesto, and you can all go sign that right after this, right? I'm a proud signatory of the reactive manifesto as well as well as the Vertex team Vertex team guys have all signed that All right, so everybody in here is a programmer writes code, right? Okay, excellent. So traditional programming right in imperative programming what you normally do The way we write code is we call a method We get the output from that method stored in a variable and then we do something useful with that variable Useful method. I know it's just you had to fill my slide right and then we call this compute method Right when we store in this variable and then we do something useful in this case we put it out to the console Right, but this is how programming works, right? It's how we've done programming for a long time unless you've done like front-end code, right? I'm bench. I started out as a web monkey doing a lot of kind of user experience user interface stuff Well, it's the same as if you don't fact-client user interface stuff So a secret is programming is a little bit different, right? We do we do callbacks so instead of the notion of calling Calling a function and storing that result we create a method that does something useful and then we define an asynchronous call to this method and Then we do some other stuff until it comes back and what that looks like is We have this compute method again like really interesting, but we've added one thing here We've added a callback. It's getting passed in and if you've used JavaScript or Ruby You know you can think of that these as as closures, right? In lambda here in the Java world, right? So when we call this method instead of getting this back and storing the result and doing something that with the result that comes back We pass in our values and we pass in the function to tell it what to do Right, so we're passing in this handler and it just calls handle and this is a this is a vertex construct async handler But the notion is we're passing in a piece of code that's going to do something and the code will get executed from inside of that method But it's not going to block. It's not going to make anybody wait for this to happen. That's very efficient, but Callbacks can kind of lead to stuff that looks like this, right? And there would actually be more code inside of here I think we have failure handling code and we can end up with these really big nested callbacks, right? This is usually referred to as callback hell and this can be kind of difficult to navigate, right? And it can get tough to read and that's you know Your ID has those little switches on the side, right? You can collect your code and try to figure out where your bracket would bracket to missing, right? So when we get to reactive programming The rest of the stuff that we're going to talk about is largely ways to deal with or make this easier So it also kind of feeds into user experience for us as developers We don't usually think about user experience in that way But if you're writing a library that somebody else is going to use you have a user that will have an experience, right? And we don't usually think about you at usability in that way But it becomes really important and as developers we all like the things that make our lives easier and we like nice clean API's, right? So I'm now going to stop talking for a while and actually look at some code, right? Because you guys want to see code, right? More than you want to see more than you want to see my slides, right? All right, so if you guys can see this this is We're going to build a little bit of Rx Java, right? So we'll get into what reactive action where it comes from but I mentioned that this is about Building API's around those kind of callbacks and asynchronous programming to make it easier for you to do that And what we have here you can see is this thing called an observable and we're subscribing to this observable and Right here. We've just got a list of strings, right? If we run this it doesn't do anything really cool It just spits out the array, right? And then no big deal So that's that's the first introduction to reactive programming is it spits out strings But the next thing we're going to do here is we're going to take the same method And we're going to add some stuff here And it's going to change what we do whoops I run the same one So now I split the words out, so it's not one object now we're going to add some other stuff I'm going to treat this as an iterable, so I'm not going to have to do the traditional way of iterating over something, right? I'm going to see you use this From iterable and then I'm going to do something called zip with whoops I missed one first Let me do something boring first again. I'm going to say observable and I'm going to do a range I'm going to pass in some numbers and I'm going to spit out The numbers one through five again like that's not real interesting, right? We just spit out one through five It gets interesting when we get to this one Because now I've got two observables here and one of them is doing that range thing Right, so this is going to this is going to create numbers and just return a number and then I'm passing in My lambda here, and I'm telling it to to spit out the number and the word and I'm using this zip with thing here So zip with is going to take these two streams of data and concatenate those streams of data for me So now I've got this right and not a lot of code that I have to write to do that So now we'll Will do something a little more interesting. We'll split this out Because now we're going to start doing some some data analysis, right? We're going to write a real programming So we have the quick brown fox jumped over the lazy dog, right? And they always tell me we start typing right this this is every letter in the alphabet So I want to find out if it is every letter in the alphabet Which by the way this example was not this was not my idea This was another guy's example who I could not find his his post against on D zone though. So Unknown guy I have to give you a lot of credit because this is a great way of Explaining this so now we've got 36 different letters But that's not really so useful is it because we want to find out exactly which ones we have So now we're going to split our words up and we're going to call modifier called distinct And we're going to add that in the mix And that's going to show me That I have 25 different letters the quick brown fox jumped over the lady dog Which is one shy of the alphabet right or the English alphabet So now let's just let's throw in another one Called sorted So now we can see what we're missing where we miss it. We're missing an ass right so we can come down here It's very quickly so live data analysis, right? Yeah I will I will get to that in just a second I will explain this in real in real actual detail So observable stuff when we do when we do all this stuff we can go from I'm still going to give you a sticker because thank you for the question interrupting me and I promise I am going to answer that I will I'll real beat that because the question was what is subscribed do what is subscribed and we will jump into what Subscribe is so we can go from simply having an array to sorting and sorting You know taking two streams of data concatenating that data into something that we can use right and this is what Rx is About reactive extensions Now let's go back to my slides here and we'll explain kind of what I was What we're just looking at So I mentioned that the asynchronous programming is different from imperative programming right because we create our method That does something useful we define an asynchronous call and then we do other stuff until that call returns Well, that's what we were doing there But we use some constructs on top of it that they kept us from getting in that kind of callback syntax And what we did is we created a method that called something useful We defined the asynchronous call and that observable object was how we defined that asynchronous call Then we attached an observer to the observable by calling subscribe and So we call subscribers. Okay. I'm watching you and this is an important construct in the Rx world until you attach a subscriber It's not gonna do anything. It's just a method. It's never gonna get executed subscribe means like okay. Actually do stuff It has to be observed for to execute anything now. There are subclasses of observable I'm going really quick. So I'm not gonna get into all them. I'm an Rx Java 2 There's a couple things flowable Complutable that have different use cases, but there's there's some types of observable And then the other big piece is so one we have this method that does something useful that we observe Right and we call observe on it and the other piece are all these modifiers that we saw right group by flat map flat That means we're going to be pulling in multiple pieces of data and concatenating them into one thing. It's useful So in the real world, what's a real-world use for this kind of it's also It's like remember the gang of four observer pattern, right? It's kind of a lot like that, right? We've got some extra methods on here right so on completed and on error are key pieces of it they're very cardinal parts of this because we know that errors are gonna happen And we know we want to deal with it So a real-world use case and at the end of these slides I have some links Ben Christensen is a guy at Netflix who talks really well And he implemented the reactive X Java library or was one of the guys that did has some great talks on on YouTube This is built using Rx Java and the reason for that is at one point in time when Netflix first began Being exploding they kept adding functionality into their homepage and I believe the number was 38 So at one point in time they had to make 38 synchronous calls to display your homepage when you log in Right, which you know what that how that's gonna get back to those numbers. We started off talking about right You're not gonna get that home page up in in a second when you're making 38 blocking calls right and so they knew they had to do something else and He began looking at reactive extensions and implemented the reactive extensions for Java Another little aside here. That's interesting. I think that you know I mentioned that on error errors are treated as first-class citizens and this paradigm forces you to deal with that and have backup plans and One of the things they do at Netflix is they there are some of these recommendations that are cached, right? So this is I logged in. This is top picks for dad You know continue watch for dad and I can guarantee you the top picks for dad do not include lab rats and Total ID drama or whatever these shows are so either They're a reactive call failed and they grab some cash data Or maybe my kids had logged in and watched things under my account But for the sake of this talk, I like to go with the first right? I think it did it illustrates the point better It's more like It's more like the ladder. All right, so reactive X reactive X started life at Microsoft in the net world This is originally a C sharp thing But it has gained a lot of life here. Let's look at reactive X here One thing that's really nice. There's a couple of things that are really nice about reactive X One thing that's really nice is Let's get back on my phone Oh, okay on She on choose your platform There's there's reactive. There's an RX implementation in just about any language that you want to use And if there's not one you can send them some poor requests, right? They have a they have more implementations So there's a lot of languages in here Some more complete than others, but there's a lot and the documentation is really nice Especially for you know open source community projects This is really nice documentation and you can really come through here And then figure out how how these pieces work and you'll get used to playing with marbles, right? This is when the people started calling these diagrams. These are these operator diagrams people started calling them marbles It's like we saw a flat map, right? So if we go to flat map There's a flat map and this is showing us what happens I'm pulling in different types of data like I'm pulling in these three types of data and what that's going to do Behind the scenes is transform it all into the same thing and give me one stream out Right so I can have red green and blue and what I get out are all identical objects, right? all zipped together or mapped together and In the spirit of marbles you can go to rx marbles calm and here's a JavaScript implementation of this and you can play with marbles and it will show you you'll see exactly how that affects The output you get and you can go like from you can go interval default empty Debalances what what a debounce does and this is a debounce of time So you notice like you won't actually get a result there if you if you come within a certain interval So you can play with these marbles, which does help when you begin When you begin programming in this in this using rx because there is a bit of a learning curve, right? So this is a shift a different way of thinking all right I'm going to start going maybe even a little bit faster So operas playing with marbles these links are also on the back, right? So reactive X or a series of extensions lots of different languages designed to let you build reactive code really easily now You can build reactive systems using this Netflix did that right they run on Tomcat on AWS, right? Everybody's heard about my Netflix microservices architecture Don't mutate your state outside the function by the way. You only want to change things inside of those functions But there are there are other toolkits to make building complete reactive systems easier, right? So reactive programming is one way of doing it and you can build a system that way But there are also toolkits to make systems easier. I mentioned this is the reactive manifesto This is a manifesto that you can go and sign You know right after this talk you're gonna completely believe this you're gonna want to come sign the manifesto, right? So you got a reactive manifesto.org The ideas behind this Starts with responsiveness right so the top of this diagram the key to building these applications is responsiveness Came out of some guys in Europe who would been doing work on really large systems inside of banks or large systems for banks And they came up with this way that this is how we need to build applications to make them responsive into scale, right? So key number one is that everything needs to be responsive people get bored they want an answer, right? And that doesn't matter that that's your end user who's interacting with the user interface as well as other people working with your library, right? We need an answer back In order to do this your system has to be resilient, right? So it has to be self-healing We need to be able to replicate the components of your system, right? So like statelessness a lot of the kind of concepts we hear when we talk about cloud data development a lot of things We hear about like in the world of microservices Any kind of failures need to be contained, right? So needs to happen inside of there, but doesn't have should not propagate out into the entire system, right? So if one piece fails, that's okay. We have a strategy for dealing with that, right? Now it's the key thing about Netflix, right? If one of these 38 calls fails, that's okay. You still get a home screen They also need to be able to be elastic So they have to scale up and scale back down, right? Because we know one of the things we know in systems today is we can't necessarily tell how much data we're gonna get, right? We had these we started off with the with lazy dog, right? But then we started adding other things and then we started adding another stream of data in there with numbers In systems today, we don't necessarily know how many other systems we have to call how many other sources of data We have right especially as we move to like a microservices architecture and the business realize They can get a new feature into production in a week or two You're gonna be dealing with a lot of new sources of data new sources of truth, right? And then the other key here they came up with is that your system should be message driven and the next few things We look at will implement this in different ways Vertex uses JSON for this right so JSON is the payload for if we're passing messages between objects The first thing we'll look at though is aca And that's because this was written by the aca guys They were really leaders in this space or the light band guys you guys are familiar with light band right the guys that Do Scala? All right, so our first toolkit dimension will look at these three things next aca vertex and in spring reactor Aca is called a toolkit for highly resilient scalable applications. I'm gonna give you one disclaimer here So I first saw aca at a conference very similar to this sat down and watch this talk on aca My immediate impression was wow, I never want to build an application using that Then when I began doing some research for this talk, I I started playing with aca and you know what aca is pretty cool So the moral that story is you know, even if the guy up front doesn't do a good job about top of the technology Go get your hands dirty, right? That's why we're looking at code. You know, I might not convince you This is good stuff, but you can change your mind by going by you know downloading this and firing up This is all open source You know you can get going really easy and there's another nice tutorial on tutorials on aca's website So the way that aca works is it uses the actor model and actors talk to other actors by sending messages to other actors mailboxes We don't we don't pass anything by reference everything gets passed completely in a message Right that message gets received some sort of action gets taken and then another message gets sent somewhere else They're completely there's no state right everything happens within the own actor which gets us back to how do we scale? How you know how we have how are we resilient right? We spin up more and more actors You know they can be in different different data centers. They can be across, you know different machines So it becomes very easy to scale. It's also very easy to bring those back in There is one sort of parent that makes this map under the covers of all the actors in the system and it uses URLs to talk to them Right so a layer of indirection, which means this you all could point to multiple different different things, right? We could we can scale out behind these internal URLs You don't have to manage this aca itself as the framework does that for you What it looks like is My next IntelliJ thing so the way that that awkward. Did anybody use scala anyway a scala fan? Couple scala fans, okay So I don't know scala one of my good one of my buddies at work and colleagues like scala a lot And so he says he said this the way that aca is written He thinks is very intuitive coming from a scala mindset or a scala based approach It's it's not hard to get to in Java either because I did the Java examples, right? So I don't know scala But if this is just a little hello world example, it's pretty simple And we have these things these actor references, right? We have a printer actor, and we have a howdy actor And what these classes do is it this is a class called it has a class called greeting, right? And it just takes this class it receives a class and You use the class type to let it know what to do So this takes a receive a who to greet class So instead of just passing a message teller or calling a method you use the object type to send in these messages Ten minute mark. Okay. Okay. They're really quick. Let me fire up. Let me debug this Task will stop. Oh great. I typed in here. Okay Anyway, that is the basic aca Example the thing to remember about aca is all message based and it handles behind the scenes this abstraction And then it makes it really easy for you scale up and scale down It's also pretty easy to get going with and pretty and pretty quick All right spring web fox is spring spring web plus reactor Spring web. I probably built a website here in the Java space. You've probably built a website using spring NBC before Spring web is you know, obviously their web toolkit They jumped into the reactor space a few years ago. They said they were going to make the user interface a lot easier to use I don't think they really got there. They ended up changing some of the names So instead of a single they have a mono and instead of a floorable they have a flux Other than that, it's almost exactly like Rx Java. So it's basically the same thing. It's mostly built into The regular spring website. So instead of so you would just get back a client response of an observable type But you would otherwise it's very similar to the way you would do traditional spring programming And I'm going to go to Eclipse Verdex, right? So my Verdex stickers up here like you will pass around Verdex stick I'm going to save one for the one for the you ask me a question So I'm going to make sure you get a sticker everybody else you got in your stickers backgrounds and stickers And there's more up front if you guys want some of these So Verdex is based on a single threaded event loop. So does it sound like no JS? That's because it was inspired by no JS the guy that wrote this wrote Hornet Q Which was the the JMS message broker inside of J of J boss EAP or J boss application server It was the world's fastest JMS message broker. It was based heavily on something called netty Netty will pop up a lot. This is also inside of spring web flux. You'll see it in a lot of the reactive space It's a super super fast low-level IO network if you've ever used Twitter or done anything from with Apple You've used netty it forms the basis of the iTunes and you're at your app store But being a message-based guy when he created Verdex He took the concept of a single-thread event loop to build websites and married on to it an event boss Right not surprising from a guy that did road event buses right her road message brokers Now this isn't like the kind of thing we have to stand up persisting. It's very simple in in a Verdex world Everything is what we call a vertical and a vertical can it has its own own event bus You can you can pass messages off the event bus and and pass your compute Over to a different vertical. I've got a app running right now and this is a public example and this I've got this this example you can get a link to this one thing about Verdex. It's super lightweight This is actually currently pretty heavy. It's using 275 megs, but I'm running nine instances and a database here So all that memory is nine instances of Verdex The code for this this is a Dutch Scott stock trading application It's not real completely fake stock trading application But we are sending trades the way this stuff ends up looking in a Verdex world So Verdex has a number of different ways to help you get through callbacks one. You can do callbacks, right? This is kind of traditional looking way to do callbacks So we we have a request stream, right? We're returning a flowable right which is an observable subtype And then we're subscribing to that here, right? So a lot of the Rx pieces are built right into Verdex to make it very easy for you to use those kind of concepts and Then Rx Java concepts like singles are built right in so you can use these and You can chain together calls So we can call multiple different services so we can like call shares We can get the price of a share we can find that if there are any orders We can grab those and zip those together and we can do this really easily, right? So when you think about it especially in a microservices world where you're calling multiple different services like the Netflix front end If you're calling, you know a couple dozen services This makes it really easy to chain those together and perform your operations right there inside of your microservice or inside of your service service and then Five minutes and then the other piece about Verdex also heavily message based So when we send when we send messages across our event bus we use JSON JSON is a first-class citizen inside of Verdex and all messages are recommended you don't have to do this Let's recommend that all your messages get passed as JSON, which is nice It's language agnostic you can attach and you can attach to the event bus directly from like your web browser using JavaScript Right so you can send them you can send a JSON message to the event bus You can read from the event bus and that's actually how we are getting in this example how we're getting these numbers, right? We're not we're talking natively from JavaScript right to this Verdex event bus and we're using JSON for our message payloads Which is key right because you want to be you want to send message You want to pass messages and we don't want to pass something by reference, right? We're passing something by value in this case JSON text JSON objects right and so JSON objects become Really what you what you work with Another another thing I didn't mention Verdex is polyglot if you don't like Java there are JavaScript Ruby Other implementations and this team has done has done a lot of work to make it feel native So if you're using the if you're using the JavaScript or the Ruby one It actually feels like you're using Java or JavaScript or Ruby it doesn't feel grafted in like a lot of say J Ruby or other things links in here This pro this book. I highly recommend great book written by Ben Christiansen and Thomas Nerquitz They're the guys that wrote Rx Java Ben Christiansen also has some really good talks that you can watch on That's like this link is hot go to 2013 On on YouTube Akka I mentioned these this is the guys for light band this book is pretty good and these were these guys really wave you know we're banner carriers for the reactive movement and Jonas Bonaire who is the CEO I guess a lot of our CTO He has a number of good talks on on this topic as well on spring web flux And then they have a lot more I think step with these slides together They're starting to talk about this a lot more in the spring world Verdex so you can download both of these books from developers dot red hat comm those are both free Really nice. I love the title a gentle guide to asynchronous programming, right? There's also lots of different tutorials including the one that I was just showing here this this trader vertical That I was that I'm running currently on open shift, which is our our Kubernetes distro on my laptop You don't have to run it on Kubernetes. You can just spit it up on your laptop, too All right, thank you very much Three minutes anybody have questions was that too fast? Yeah So how does Verdex compare to it? So Reactive in general so no uses that callback model, right? So, you know when a web request comes in to an endpoint being serviced by node It grabs our request and then sends the work off to another thread and then continues listening, right? Verdex works very much the same way And that's a reactive method of programming because you think by the way we do things with servlets or traditional HTTP calls, right? You know if you're programming Java servlet Call comes in Java servlet connects to database or you know grabs a database connection from somewhere performs the query gets the query back Unmarsals it turns into an object decorates with some other stuff and then sends the call back, right? Just fundamentally different than like a Verdex event loop or or very similar in Node.js world call comes in Verdex Send something to the event bus which contains a handler saying what to do when it comes back So the question was are callbacks the same as promises? No, they're not the same as promises. There's another piece to there's a future That's a Verdex future. It's different from a Java future a Java future blocks a Verdex future does not block at all And so in the Verdex world we use the Verdex futures Promises are So callbacks don't have to be any particular kind of object, right? It's just a piece of code largely whereas a promise is going to return something in the future But it's a concert on top of that and the notion that the callbacks are the lowest level the lowest easiest way of doing that And you still use it's fine to use them, right? It's just you don't want to end up with too many nested callbacks when it becomes problematic, right? Not quite the same Any other questions? Alright, thanks and enjoy the rest of the weekend