 Saya memutuskan setelah beberapa tahun untuk mencuba eksperimen Windows untuk melihat jika saya dapat memperkenalkan efektifnya dan menjadikan Windows. Saya menunggu sebuah tahun sebab laptop saya mempunyai sebuah tahun. Selepas sebuah tahun, saya kembali ke Linux. Saya berjalan-jalan dengan Ubuntu di sini. Baiklah, ini sebuah laptop yang dipanggil Haka Roundhouse. Dan itu Haka Roundhouse. Well, those are a number of Haka Roundhouses. It's actually a Western term, Haka Roundhouse. The Chinese call it a Haka Roundhouse. They call it a Tuolou, which means Earth Building. And if you inspect, that is the description of a monolith. Agree? That is a description of a building monolith. And we have a number of monoliths built close to each other. And that's the inspiration of this new, not a design pattern. Implementation pattern which I'm playing with, which I will be putting into production for my next project. A bit about myself. I write talks because I want to clarify my own thinking. I put them down into a presentation and you guys are my guinea pigs. So please give feedback to me. Anyway, in Haka Roundhouse, they've got tens of families, 20, 30, 40 families living under the same roof. And there's a clan chief that rules the entire monolith. Their concept is it's closed to the outside. And it's three storeys high. It doesn't look three storeys high, but it is three storeys high. The walls are like three meters thick walls. So it's a fort, effectively it's a fort. So it protects outsiders from coming in. And the insiders can go around their business very efficiently. So it's open on the inside. And if there are issues within that community, within a Roundhouse, they bring their grievances to the clan chief. And the clan chief's decision is final. That's it. It's settled one way or the other. But if you have issues with other Roundhouses, this Roundhouse is an issue with this Roundhouse, then it's going to be a problem because they're ruled by different clan chiefs, or different chiefs. And that's why walls occur. So what are the pros and cons of software monoliths? I can name a lot of cons. Big ball of mud cannot be extended, that kind of stuff. Can anybody name your pro? Ya, please. Okay, no worries, no pressure. Does anybody here program? I mean, you can reuse common libraries or utility stuff. Yup. And it's all linked. All the earliest languages like C, for example, drew upon very many libraries. And they're all linked to a common deliveral binary. And they were monoliths. And I think the major pro of a monolith is there's one thing to take care of. There may be many components, but they get linked and there's one deliverable that you deliver into production to take care of. Compared with microservices. Who thinks microservices are a good thing? I think so. I think most people, I think it's fashionable. Microservices are very fashionable these days. And monoliths have gone out of fashion. So I don't know why I'm talking about monoliths right now, but I can hope to convince you that it's a good way to start. Anyway, pros and cons of monoliths. Monoliths have plenty of cons. And I'm going to show you all the pros later as we develop. So let's go through a few questions in our minds. Can multiple software modules happily live together under the same monolith? Can, cannot, can. Should these modules, these software modules live in the same software report? They can. In a project, they should. But they don't have to. They can be from different libraries. Anybody disagree that communications within a monolith is fast and reliable? Intra process communication. It's fast and reliable. Unless the whole process dies, then you've got no communication at all. But communication outside of the monolith, one roundhouse talking to another, separate roundhouse. It depends on the network. And some networks are very good. Some networks are not so good. But with networks, come a lack of guarantees. Response times, latencies, dan sebagainya. Jadi, apabila monolith mempunyai fungsi, apabila keluarga yang mempunyai sebuah roundhouse, menjadi sangat berjaya cuba menyelamatkan kerja. Apa yang kerja membuat? Kerja mengambil keluarga yang berjaya? Dia mengambil kerja. Maksud saya, keluarga yang mempunyai kerja. Maksud saya, mempunyai kerja. Maksud saya, dan ini adalah inspirasi saya untuk membuat monolith baru. Jadi, boleh kita membuat monolith micro-service bersedia? Mari kita pergi. Dan, pertama, saya akan beritahu. Berapa banyak anda di sini yang baru untuk pergi? Seperti... Oh, cukup banyak. Okey, saya akan pergi dengan mudah. Saya akan pergi dengan mudah. Semuanya mengambil kongsi. Kemudian... salah satu perkara yang mengintirkan saya adalah perkara ini, kongsi kongsi. Dan kongsi kongsi adalah jika... namanya mengambil dari kongsi kongsi, kongsi ekskursi interparenya. Adalah, James dan saya berkongsi kerja tadi. James berkongsi dengan Traveloka. Dia mengambil kejujuran kerja Pada saat dia kata, ya, saya dah selesai. Saya akan tangani resursi kepada saya. Jadi, Routin Go Situ yang telah mengambil resursi dan memperkenalkan. Kita hanya ada satu screens atau satu set set. Tetapi, routin Go Situ dapat menggunakan tahanan seorang tahanan seorang. Jadi, Routin Go Situ bukan tahanan seorang tahanan seorang. Routin Go Situ adalah banyak-manyanya yang mengubah tahanan seorang. Jadi, sebuah prosesor 4-koren seperti yang saya ada di sini, boleh mempunyai 4 tahanan sebab ada 4 kerja dan 4 CPU. Tetapi, setiap CPU sebab routin Go Situ sangat efisien, boleh mengandalkan tahanan seorang tahanan seorang. Jadi, anda boleh mempunyai 40,000-50,000. Robert Pike dalam routin Go Situ saya rasa, membuat 1 juta routin Go Situ di laptop dan menunjukkan. Ya, dan ia berlaku. Jadi, Routin Go ini disebut Routin Go, dan Routin Go dapat menghubungi dengan orang lain menggunakan apa yang Routin Go panggil seorang tahanan. Jadi, memikirkan tahanan seorang tahanan. Sebenarnya, tahanan seorang tahanan semasa anda dapat mengubah tahanan seorang tahanan seorang tahanan dari satu routin Go ke satu Routin Go. Projek tahanan lain adalah GRPC. Ada sesiapa dengar tentang GRPC? What does GRPC stand for? GRPC Remote Procedure Call. It's a remote procedure called library, which means you can call a function as though it is a local function, as though it is a function you have written in your monolith, your traditional monolith, but over the network. So that is a remote procedure call. And it's fashionable because it is fast, it is efficient, it is not exclusive. In other words, it's not snobbish because even though it speaks Go, GRPC speaks Go very well. It also speaks Java. It also speaks Python. It also speaks Ruby. So all these different communities can speak GRPC and inter-operate with each other. And GRPC is a complicated thing. It is not a simple library where you just link in stuff. GRPC is a bit complicated. So you need to have a protocol compiler, interface compiler, they call it Proto-C. So that Proto-C tool will generate two things, two sets of things. The first thing it will generate is the things you pass down the channels, the messages. So it will generate the message types in the language of your choice. It can generate message types for Go, Java, Ruby, Python, what have you. Not only does it generate message types, it also generates function stubs. So a subroutine call would have a subroutine name and Proto-C compiler would generate function stubs. No implementation yet, but at least the declarations are there. So how can we use these message types in our Go Routines? And what do we do with those function stubs? So answer those questions. I'll sit down now and I'll demonstrate a traditional monolith. So if I run a program, the traditional monolith says printf2plus3 equals the dollar V for those C guys and Java guys is value. So 2 plus 3, the value 2 plus 3 is the sum of 2 and 3, which is, hopefully it's correct, 5. And the sum of 2 and 3 is defined here. Go has this funny thing called a reverse declaration syntax. In Java, you put int A. In Go, you say Aint. So it's upside down. You need to have a bit of gear shifting when you first start with it. But once you get used to it, it's natural. And return A plus B. So Go also has a funny convention. The funny convention is anything with a lower case is local, private. And anything with an uppercase just like my name, S-U-S-R-U, capital S-I-U is a name. It's exposed. It's a public function. So sum is a private function. So why do many monoliths, not all, many typically grow into big unmanageable messes? The clue is here. Let's look at the function signature. Is there any constraint in the function signature? It's completely free up to you to define the function signature. And up to you to define the return type. Completely free. And what happens when there's too much freedom? You get chaos when there's too much freedom. So in a small project, freedom is good because it gives you the freedom to do stuff. But as the project gets big and gets old, you forgot which other people had done. Obviously, you don't know what other people have done. So because there's too much freedom, monoliths get into a mess. So how do we fix this major problem? So I think we can fix this problem using the Haka Roundhouse Monolith. Haka Roundhouse Monolith looks like this. This is a Go program and it starts by saying this is the main package which is where the main function lives which is the entry point for that monolith. And in Go the statement to import libraries is called import. So you import 2 libraries you import the FMT the Go community calls it Fumped. It just doesn't sound right. I call it FMT or format. The FMT format library. And this very very very very very very long thing which I wrote not quite but I caused it to be written which I decide to give it a short name called PB. So this very very long thing is contracted and I refer to it as PB short for protocol buffer. And this very very very very long thing is generated by Proto C. So this thing is a comment but not really a comment. This is executable comment. There's a tool called Go Generate which I'll show you in a while but that Go Generate tool will look at this comment and say ah you're asking me whenever I compile this program whenever you ask me to run Go Generate on this program to run this command line and generate this thing for me. So ah this is normal stuff. capital P print line means I'm pulling in an exported function of the format library. The result is the sum of the reference of PB apostrophe S sum request method which comprises of two parameters A and parameter B the arguments of which are two and three and returns this thing called rest whatever that is we don't know yet but rest has this thing inside rest called result which we'll find out what it is in a second. But essentially that function here you can guess it's two integers. It sums two integers and returns the integer. So ignore this PB for a while. What is the function signature? It's this A part B part it's a single thing. It's one thing and the return thing is one thing. Is there by using one thing here function thing and return thing2 the thing inside thing can be as complex as you want and the return can be as complex as you want do we lose any loss of freedom? what do you think? we certainly lose freedom because in the past we could declare anything we want now we can only declare one thing and returns only one thing but we don't lose capability so we lose freedom we are constrained but we do not lose capability so there are constraints GRPC and forces constraints on us the same way your parents say eat your vegetables so GRPC is a caring parent that says don't spread your parameters all over the place put them in one thing but there is no loss of capability so let's talk about Peragot buffers code users brand new feature out since 1.10 experimental go modules for those of you new to go go never had an official package manager and never had an official dependency manager this is an experiment to define an official dependency manager they had go that before they decided that that was the wrong way to go so now they have this dependency manager called go modules and I declare my entire software which is only one monolith but my entire set of software as presentation dealing with Haka Roundhouse and I'm going to put it on github under my account and I'm going to call that whole module the entire module modules github whatever so the first thing we need to do is we need to download and extract the protocol compiler the proto-c so this is where you can find it you pull down proto-c for your platform it's available in windows mac linux so I pull down because I'm running linux the linux version and you need to tell go modules so tell go that you're using gRPC so that's the first line and the second line is tell go modules that you're using this proto-c generator for go so those are the two external dependencies now if you've gone to github.com and downloaded that software clone that repo go modules all you need to do is go mod download and you pull down all the dependencies just like bundle install for those people in ruby or maven what's the thing called I can't remember maven what it's that kind of function that kind of feature so there is something you have to write a protocol buffer proto definition and it defines the interface and clients so in our case we are not yet defining a remote service but we are going to use the message types so the first thing you do is you think about what should you name the module since I'm dealing with arithmetic that deals with sums, multiply, divide I call the module arithmetic and arithmetic is a long name so I just call it ARITH protocol 3 there are 2 messages I define that the message called sum request A is an integer 32 a 32 bit integer you can have in 64 but I decide to have an integer 32 big enough for me equals 1 it's not an assignment equals 1 is not an assignment in my view big disservice by using the equal sign it just says this should be in slot number 1 this should be in slot number 1 that's all and B should be in slot number 2 that's what it means slot number 1, slot number 2 why? because these people who invented GRPC the Google folks know that your messages are not going to stay like this forever so they decide to make it able to grow so you can go into different slots and it won't conflict with each other alright learn more about it if you are interested by any way, the response has only one slot slot number 1 which is an integer 32, it's called result note also that I use lowercase a and lowercase b and lowercase result but go because of its conventions exported functions the protocol generator did that for me so it's automatic in ruby or in java or in python, it will remain lowercase it's idiomatic for your language so let's go and do it let's go and run this function so I've just copied that command line and when I run it like any good unix feature it doesn't say anything but it's actually generator a file for me okay those people working in windows they see all fancies clogged but anyway let's explain the thing before I show you capital minus i or minus capital i include folder and the output should be passed through the output should be passed through the grpc plugin for go to generate the output stop so let's look at what I've generated so I'm looking at the proto sub folder here, the sub directory this is the file I put in so this was written 15 october and this was the file that was generated today, just now 10.11.42 utc so my laptop runs utc so it generates this go source file for you and if you're using ruby, it generates a ruby file using java file but instead of looking inside the file and get distracted I'll show you how to use it first you've already seen all this let's go and run it so the nice thing about go is clear this screen so the nice thing about go is it's a compiled language but you can run it as though it is an interpreter and it interprets really quickly so when I run this command it's going to look at that source file, may not go compile it stick it in a temporary folder somewhere the compiled binary and execute the binary so how long do you think it's going to take? it's pretty long why? it took 2.2 seconds actually the first time took longer because go caches compilations what it's doing, it's pulling in the whole gRPC world and linking all those libraries and generating one single static binary and it took 2 seconds and you have a monolith that can now add 2 numbers nothing great that's not a service that's a monolith that's not a service let's make it a service so to make it a service let's create 2 things let's create the service itself but we also need to create a load generator for testing so let me go through this program slowly the first thing I do is I'm going to make the channel remember channel is a drain where you can put types through the drain you can put integers you can put user defined types through that channel so I'm going to make a channel comprising of some requests pb.sumrequest pbs.sumrequest and not the actual sum request itself a reference to the sum request so it's just moving pointers around it's very efficient and that channel is going to be named request channel requestch and loadgen will take in requestch and is this 2 basic for you guys should I go faster okay let's go faster so essentially some service takes in request channel and outputs a response channel and this response channel can be read from and printed out and we have 2 services here load generator service and sum service that adds up 2 integers let's look at those services so the load generator runs as a go routine the load generator runs as a go routine what this means is it doesn't block the mainline those people working in Node.js blocking is a sin you have any operation that blocks the mainline is a sin your entire program stops this is a blocking operation put into a go routine so that it doesn't block the mainline so it is a much nicer way of writing a separate process quote-unquote within a program without blocking the main program so all it does is generate 2 random integers it's calling the random library r&d library integer n from 0 to up to 99 so it can give you 0 to 99 and what it does is it puts that generator request into the channel that's all it does load generator function does and it sleeps for 1s forever forever the sum service what it does is another go routine so now you've got 2 separate go routines running under the roundhouse but roundhouse think of 2 families living next to each other doing their stuff independently but communicating using a channel and what this sum service does all it does is it reads from the request channel and it adds 2 numbers and returns it to another channel so it takes the thing add it together so 2 families connected via pipes or channels so let's go and run this service so when i run that service it does that so this is 1 roundhouse 2 families talking to each other 1 creating a pair of numbers and another adding them together and sending it out to the clan chief and the clan chief takes all the credit by printing it out to the screen 1 roundhouse doing this independent go routines communicating nice, right? let's cancel this so let's pretend we're going to deploy let's pretend we're going to deploy so let me explain this command line C go enable equals 0 means build me a completely statically link binary with no external dependencies this is not necessarily a good thing by something which i do you actually sometimes want the external dependencies or C library and all that for language locality but for our purpose this is a completely independent binary so if i use the file utility to see what kind of thing HS is it's a 64 bit binary least significant bit first statically link not stripped 4 linux so i can take this stuff and go to any linux computer and you will run no other dependencies no bundle install no npm whatever npm install just take this binary run it's done it's completely self-contained but then you ask my bosses must run windows okay i'm running i'm running a linux laptop here it generates linux binaries now i'm saying cross compile to windows cross compile to windows for windows 64 bit windows you can cross compile to 32 bit windows if anybody still uses it and that's going to take a few seconds all of 3 seconds and now i have mswindow executable i can take this single exe file go to any modern 64 bit windows machine you will run and you can target mac, you can target arm, you can target a whole bunch of things so my statement is this fulfills the promise of java it's a self-contained jar it's a fact jar with all the libraries compiled in within itself with no dependencies for jars you still need a jvm but for windows no jvm needed you still need the machine and the OS of course how big is it the linux binary is 9.9 megabytes because it's not stripped and the windows binary is 9.6 megabytes because it's stripped stripped of debugging symbols that's what stripped means nothing to do with strippedies so for the price of a 10 megabyte executable you've got a completely independent self grpc-enabled monolith any questions? just interrupt me, any questions right now? okay just to make sure i understand before extracting the microsoft cdl the monolith with grpc completely that's what we're going to talk about next right now we have a monolith 2 families and around half talking to each other via channels what happens when this family gets very successful and the chief kicks him out that's what we're going to talk about next one of the families get very successful we want to kick him out so they can start their own roundhouse in the context of computing so that we can scale that service so that we can scale that and that service alone we don't want to scale the roundhouse it's very big we don't want to scale the whole monolith so let's extract the sum service and let's go through how to do it so the first thing we need to do is we need to define the rpc if there are seeds in the middle or you feel like standing okay no problem so we have to define the sum service and implement the sum microservice and update the monolith to call now over the network the evil network the sum service so how do you define the rpc the remote procedure called quite simply like this what this means is the arithmetic service can have many functions one of them is called sum I only declared one function but it can have many it could have multiplied in there it could have divide in there but I only defined sum and return sum response as easy as can be and sum request and sum response we have seen before A and B and the return result so I create a new file called the service name I actually call it Hakka service 2 main it's a new monolith so it's got kicked out of the roundhouse it's creating its own roundhouse so it has its own main program the go generate but because it's talking over the network we must define what port it's talking over so this service I decided that you will listen I decided you can choose your own port I decided it will be listening on port 551 on all interfaces local holes network interface 1 network interface 2 network interface N if I've got N network interfaces or port 5051 and do something with the messages I receive that's what it means now this is something go specific in Java you have classes in C sharp you have classes in C++ you have classes go doesn't have classes go does not have classes go has a glorified struct go has a glorified struct but you can declare methods on the structs so it behaves almost like a class so here I'm declaring an empty struct a class with no member function an empty struct that's what opens curly and here's how you define a method on that struct so S which is a parameter name is a pointer to server and the parameters for go takes in this funny thing called context I'll explain in a while a sum request and returns 2 things so it takes in a sum request and returns 2 things it returns a sum response and an error status so I'm going to go slow here because for those people new to go this is the go gold mine this is the go gold mine so it takes a context and a request and returns a response and status what is a context anytime you deal with a network you have to consider things like what if the server takes too long timeouts so you can specify timeouts in a context it's an automatic circuit breaker if the process is going to take too long it's going to kill the process and return and eat up all your memory and kill your servers so by using context you can build in circuit breakers if you like almost like build in circuit breakers very very powerful concept it can be used for other things as well but timeouts are one of the most important things context can be used for I'm not going to go into detail it's not the subject of this talk but know that it exists so how am I going to implement the server but before implementing the server now we're back into the roundhouse the roundhouse is going to call the external service so we're now back in the roundhouse oh sorry sorry we're still not back in the roundhouse we're now at the server's implementation we create a new server we register the server internally declare that the server is coming up we have this something to do with reflection so that it can tell what the parameters are and if you are unable to start the server it shows an error message saying my server refuse to start but if its server starts properly it will say gRPC server alright so let's run our gRPC server the server is running if I didn't put that print line statement nothing shows it's a unique fashion so let's update the service here is a go routine so inside a family in a roundhouse read something from the request channel call gRPC server so call that remote thing call that remote thing and the remote thing will return 2 things a result and an error status if my error status is not nil that means there's an error in there do something about it what am I going to do something about it I'm not going to do anything I'm going to print it out and say I received an error but that's the other thing we go some people find this irritating like hell because errors in go are in your face I'm going to give you an error you programmer god decide what to do with that error you can choose to ignore it but you have to make a conscious decision of what to do with it so I made a conscious decision of just printing it out some people you see a lot of code where you see an underscore instead of error it means I don't want to know about it if there's an error I don't want to know about it let the program crash Erlang does that by the way let it crash let it burn anyway go forces you to consider errors so what is gRPC here is my address my port is listening to port 5051 but now I need to call localhost I need to call a specific IP address in this case my computer is talking within the computer so I'm going to call localhost port 551 and I'm going to ask gRPC to make a connection for me once gRPC has made the connection for me I've got a connection object if it cannot connect properly it returns an error so go forces you to decide what to do I decide to say just print it out could not connect to the server then you create a new client PB new arithmetic client connection now who wrote this program who do you think wrote this program did I write this program the protocy generator compile this program for me for free so I don't have to write this program the protocy compiler generated this program for me but I had to write this program c.sum because that's the implementation to add 2 numbers together context background means I'm not going to tell you anything about timeouts and all that it's the default context and I'm going to send in my request and return the result so 0 and 1 who do you call 2 is actually create a client object and execute that client object's sum function and you get the result so let's run this thing so my server is still running up here I'm going to run this and the same thing happens let's kill the server shall we control C server die so I killed the server notice the error messages can the back row C is the text big enough? notice the error messages could not compute sum sum service GRPC knows about sum service I wrote the error message I wrote the error message saying sum service could not compute sum then I tagged on GRPC error message which says RPC error unavailable and transient failure latest connection so this is why go forces the error in your face it makes you write meaningful error messages so now I immediately know it's my sum service that has this error let's revive that service shall we so when a service comes up again it's back to normal I don't have to restart the client nothing it's back to normal so that's why I like GRPC and we have created a monolith calling an external service that can be independently scale so I can have a thousand instances of this sum service and it's fine a lot the biggest overhead is what? what's the biggest overhead? the network the network cannot so if you if you don't want latency what do you do? keep it a monolith but you want the scale bochart bochart means no choice must have an external service okay so RPCs let's talk about synchronous vs asynchronous RPCs are synchronous remote procedure calls telephone calls I hate telephone calls nowadays I turn on my phone I hate telephone calls because they interrupt my flow of thought and hello tekchun are you there wait tekchun say something tekchun can you do this for me tekchun say scan cannot it is blocking RPCs are blocking Google decides blocking is good it's agree there's another kind of school of thought called event sourcing where it works at event driven systems where it works like email I love email why do I love email? people can send me email I can choose not to read it until I choose to read it so I choose to read email go through my email box I make all my replies then I go away and I don't read it again we don't have to plan for meeting I send him an email to tell him to do something and we can read it at our own time so event driven architectures are very very powerful that's what apake that's what apache Kafka is all about and last meetup I gave a talk on net streaming that's what event sourcing is all about so what should you do which you prefer it's up to you some people like telephone call some people like email I prefer email but that's a question for another time how can a monolith handle events can cannot obviously can la otherwise I won't be asking the question public subscribe can a monolith handle public subscribe the answer is yes but not alone monolith needs an external an external dependency so you can do public subscribe with a message broker and this message broker called net is written in go so it's a single binary you take this single binary run it you get a message broker you don't have to install anything you just use that binary so let's implement public subscribe you download if you are using windows you download the windows path gnetzd and run it let's kill this clear this run the message broker it's called go netz demon go netzd starting net server version 1.3 server is ready that's it no startup time like java taking 15 minutes or whatever it starts instantly alright so I have my message broker run my system I need to call a few things I need to call netz library I need to tell netz netz can use jesong netz can use plain text netz can use any type you define but I'm going to tell netz to use protocol buffers because GRPC uses by default protocol buffers so I need to tell netz to use protocol buffers I'm using one of my own libraries called default dflt and my generated protocol buffer aromatic package again I have 2 services sum service and load generator so the main function is exceedingly simple that's the entire main function print something saying I'm starting up load the sum service load generator service and wait forever select open close wait forever that's the simplest main function ever agree agree so what does load generator do it's here's some boilerplate it's saying please use protocol buffers that's what it says it's running in a go routine and it takes it takes it takes that request which I generated and publishes it publish means both the megaphone and say hello my request is a equals 2 b equals 3 I broadcast it I don't care if anybody listen to my message dalam bilik ini, saya akan seperti Ijiat kata A equals 2, B equals 3, dan meskulannya hilang selama-lamanya. Orang-orang dalam klas filosofi, jika ada ketua-tua di janggal, dan tiada siapa-siapa di sana untuk mendengar. Tak penting. Apa pun, mari kita berbicara. Sesuatu pembentangan, jika seseorang dalam audien ini mendengar ke perjalanan itu, jika seseorang mendengar ke perjalanan itu, ia berkata, okey, saya akan menghubungi ke channel itu, pembentangan itu, yang menghubungi pembentangan saya. Dan jika saya mendengar meskulannya, saya akan menghubungi fungsi ini. Saya akan menghubungi fungsi ini sebagai rutin perjalanan. Jadi jika saya mendengar 1,000 meskulannya, setiap kali, saya menghubungi 1,000 rutin perjalanan. Dan 1,000 rutin perjalanan akan mengekalkan keperluan. Mereka akan mengekalkan keperluan. Dan semua yang dikatakan adalah 2 nombor. Itu semua yang dikatakan. Jadi mari kita menghubungi meskulannya sebagai monolith. Mari kita membunuh program ini. Jadi mari kita menghubungi meskulannya sebagai monolith. Dan apa yang monolith ini lakukan adalah mengekalkan nombor kita. Mengekalkan nombor, 7,69 plus 8, 98, apa-apa. Dan sesuatu... ...anak keluarga yang sama di rumah haka-orang ... ...yang sama monolith ... ...dia mendengar nombor ini dan menggantikan. Apa yang akan berlaku jika saya menghubungi meskulannya? Saya akan mengambil nombor. Saya akan mengambil nombor. Mari kita mengambil nombor. Megaphone Tuhan Ia masih diberikan Ia bercakap tapi tak ada Megaphone Jadi orang di rumah segera tak boleh dengar apa-apa Jika saya memberikan dia Megaphone kembali Tak perlu mulakan apa-apa, tak perlu mulakan monolith Ia kembali Macam mana yang anda lebih suka? GRPC, mesej Ia berdua mempunyai boros dan kon Untuk anda Ia bukan kerja saya untuk mengatakan yang lebih baik Yang tak begitu bagus Nombor yang lain sebenarnya menarik sedikit Jadi mungkin beberapa pizza Tetapi Itu Ia monolith di rumah segera Jadi di sumber Jika anda ingin menerima ini untuk diri anda, kota anda sudah dihubung Di sumber Monolith mempunyai mesej kerana terlalu banyak berat Monolith mempunyai mesej kerana terlalu banyak berat Kita ingin Mama Papa beritahu kita untuk menanam-anam mesej Papa Mama ini adalah ibu bapa kita Grpc Grpc memberi kekakuan keadaan Untuk kami mempunyai kekakuan kita Setelah kami mempunyai kekakuan kita Kita tak perlu memainkan pemenang Kita boleh menggunakan mesej Semua dalam monolith Secara yang anda perlukan Apabila mereka menjelaskan bahawa ibu bapa kamu berkata, kita mesti mengalami fungsi ini. Kerana perniagaan kita bergantung pada ia. Kemudian kamu menerima servis itu. Dan ia sangat mudah untuk menerima servis itu kerana kamu mempunyai PRPC di tempat pertama. Jadi ia adalah tujuan saya. Terima kasih. Pertanyaan. Ya. Jadi langgan ini juga boleh membuat banyak fungsi. Ada satu monolid yang membuat banyak masalah. Jadi saya boleh membuat kecuali fungsi yang boleh dilakukan. Saya sangat gembira kamu tanya soalan itu. Itu soalan yang akan berkongsi pada kedua saya. Ia akan berjalan-jalan nanti. Tapi bagaimana besar kita mesti membuat fungsi ini? Bagaimana besar adalah servis micros. Bagaimana servis micros? Bagaimana servis micros? Dengan dua jenis kode. Atau dua jenis kode. Pada pukul yang seterusnya. Boleh saya memastikan bahawa ia berlaku? Bagaimana perkara ini disebut perkara yang akan berlaku? Itu yang saya suruh kamu menerima. Itu yang saya suruh kamu menerima. Saya ada periksaan tentang perkara ini. Bagaimana perkara ini? Saya rasa kita mesti ambil berita. Semua orang akan ambil beberapa minyak dan minyak. Dan kembali kemudian. Tapi sebelum ada pertanyaan lagi. Adakah kamu fikir ini boleh digunakan dalam perasaan kamu? Bagaimana perkara ini? Bagaimana perkara ini? Bagaimana perkara ini? Bagaimana perkara ini? Bagaimana perkara ini? Bagaimana perkara ini? Bagaimana perkara ini? Ingat sistem kemahiran yang diberi. Jika tiada orang dengar, saya tak peduli. Bukan salah. Bagaimana perkara ini? Bagaimana perkara ini? Bukan salah. Kerana modulnya adalah telefon mega. Bagaimana perkara yang diberi? Bukan salah. Kerana saya masih bercakap. Tapi tiada orang yang boleh dengar. Sekarang, apa yang kamu minta adalah pertanyaan yang sangat berkeluar. Bukan telefon mega, boleh saya... Boleh saya memulai... Boleh saya memulai pembentangan yang diberi? Jadi itu telah diberi. Dan jawabannya, ya. Bagaimana perkara ini? Kamu boleh gunakan Kafka. Tapi saya tak suka Kafka. Itu jawa! Pembezaan naik. Pembezaan naik. Pembezaan naik. Pembezaan naik. Kamu memulai untuk menulis pembentangan yang diberi. Dan pembentangan yang diberi, ia besar seperti pembentangan, besar seperti pembentangan. Kamu boleh menulis pembentangan selama-lamanya. Atau kamu boleh membuat pembentangan yang diberi sebuah hari atau 10 segi. Ada apa-apa pertanyaan? Ya. Jadi GRPC membuat pembentangan yang diberi untuk pembentangan? Tak. Ada apa-apa pertanyaan? GRPC membuat pembentangan yang diberi untuk pembentangan? Tak. Ada pembentangan yang diberi. Bagaimana semuanya yang berlaku? Ia berlaku di sini. Sebenarnya ia bukan pembentangan. Kamu membuatnya. Ia di Proto. Proto file. Kamu menulis proto file. Kamu memutuskan semuanya. Kamu adalah Tuhan. Kamu adalah programmer. Kamu memutuskan GRPC untuk membuat semua fungsi ini dan membuat saya. Jadi GRPC tak membuat sesuatu untuk kamu. Ia membuat pembentangan untuk kamu, tapi... Ia tak membuat pembentangan. Jadi ini adalah kontrak antara... Ia adalah dokumen kontrak. Bagaimana kontrak dan kemudian ia mengambil keterangan? Ia adalah proto file adalah dokumen kontrak. Ini adalah pertanyaan. Jadi itu bermaksud kamu membuat ini menjadi pembentangan yang berlaku? Jadi itu bermaksud kamu membuat 2 pembentangan yang berlaku? Ah! Kadang-kadang saya bercakap dengan pembentangan dari Google. Yang cuba mempromosikan GRPC. Dan saya tanya dia betul-betul pertanyaannya. Bagaimana proto filenya? Ia patutnya dalam pembentangan yang sama seperti software kamu? Atau patutnya dalam pembentangan yang berlaku? Bagaimana untuk Google? Mereka hanya mempunyai pembentangan yang besar. Tapi... ...tapi walaupun ada pembentangan yang besar, ia di tempat yang berlaku dalam pembentangan yang besar. Jadi sebetulnya ia adalah pembentangan yang berlaku. Jadi periksaan dia adalah di tempat yang berlaku. Saya berkongsi periksaan dia. Pembentangan ini patut diperlukan kepada pembentangan yang berlaku di tempat yang berlaku. Bukan perlukan. Ia mudah diperlukan tapi diperlukan. Jadi ia seperti... Jika anak kamu mahu belajar bagaimana untuk mengambil pembentangan, dan dia belum ada pembentangan lagi, Papa boleh saya mempunyai pembentangan yang berlaku? Kamu mengambil pembentangan yang berlaku. Ah, anak, pembentangan yang berlaku atau anak pembentangan yang berlaku. Jadi, pembentangan untuk menghidupi semua protokol dengan ayah adalah sangat penting untuk menghidupi pembentangan. Kerana jika kita tidak menghidupi pembentangan, apa yang berlaku? Pembentangan kamu menjadi pembentangan yang besar. Ia tidak menghidupi. Seperti yang saya katakan, pembentangan-pembentangan yang berlaku adalah pembentangan yang berlaku mengambil pembentangan yang berlaku dan ia menjadi berlaku. Sebenarnya, secara magik. Kerana kamu belajar sebuah perkara yang baik. Jika kamu tidak... Jika kamu menghidupi anak kamu untuk melakukan apa-apa yang kamu mahu dalam dunia, terlalu berlaku. Ia sebuah dunia modern. Kamu boleh berfikir untuk membuat apa-apa. Terlalu berlaku. Bagus. Adakah pertanyaan? Jika tidak, mari kita ambil 5 minit.