Slides about the usage of SObjectizer and RESTinio in implementation of performant socks5/http1.1 proxy server that has to deal with thousands of entry points.
Dive into SObjectizer 5.5. Seventh part: Message LimitsYauheni Akhotnikau
Next part of serie with deep dive into SObjectizer-5.5. A brief explanation of message limits feature. This feature allows to protect agents from overloading in simple situations and can be used as building blocks for more complex and domain-specific overload control schemes.
This is the next part of the serie of presentations with deep introduction into features of SObjectizer-5.5.
This part is dedicated to such important feature as cooperations.
Dive into SObjectizer 5.5. Seventh part: Message LimitsYauheni Akhotnikau
Next part of serie with deep dive into SObjectizer-5.5. A brief explanation of message limits feature. This feature allows to protect agents from overloading in simple situations and can be used as building blocks for more complex and domain-specific overload control schemes.
This is the next part of the serie of presentations with deep introduction into features of SObjectizer-5.5.
This part is dedicated to such important feature as cooperations.
Dive into SObjectizer 5.5. Tenth part: Mutable MessagesYauheni Akhotnikau
This part describes a feature which was introduced in v.5.5.19: an ability to send mutable messages with guarantees that it will be delivered to at most one receiver.
Orchard is a free, open source, community-focused Content Management System built on the ASP.NET MVC platform. Software IP management and project development governance are provided by Outercurve Foundation, a nonprofit fund.
How to build to do app using vue composition api and vuex 4 with typescriptKaty Slemon
In this tutorial, we will build a to-do app using Vue Composition API & Vuex 4 with Typescript. We will learn and explore Composition API & Options API as well
Date Processing Attracts Bugs or 77 Defects in Qt 6Andrey Karpov
The recent Qt 6 release compelled us to recheck the framework with PVS-Studio. In this article, we reviewed various interesting errors we found, for example, those related to processing dates. The errors we discovered prove that developers can greatly benefit from regularly checking their projects with tools like PVS-Studio.
Testing RESTful Webservices using the REST-assured frameworkMicha Kops
The REST-assured framework and its features explained by example.
For detailed information please take a look at my full tutorial including the sources at http://www.hascode.com/2011/10/testing-restful-web-services-made-easy-using-the-rest-assured-framework/
In this talk we will take a deep dive into the inner workings of JavaScript. Scopes, functions, closures, and prototypes are just some of the most misunderstood terms in the JavaScript world. We will take a tour "behind the scenes" of JavaScript to learn how to write better code.
In this presentation, I'm covering the topics
Node Package Manager (npm)
initializing a node project
dependencies and dev dependencies
Installation, listing and uninstallation of node packages
Importing of modules
Leveraging Completable Futures to handle your query results AsynchrhonouslyDavid Gómez García
The challenges of developing applications recently have increased. With the popularity of cloud environments, the scalability required by new architectures and the need to support more load efficiently, there has been an increase in attention that we need to pay to concurrency and efficiency.
One strategy to achieve that efficiency consists of distributing the modules of your application in several different smaller components running concurrently. But one of the problems that arise from such distribution of running modules comes when you need to send a request (and wait for the response) to several different modules. How do you design that request(s)-response(s) to be as efficient as possible?
CompletableFutures was introduced with Java 8 but has evolved over the years with every new version of Java released. In this talk, we will take a look at it, to:
understand how to use CompletableFutures,
how they can help us to split our workload into different request and coordinate them asynchronously and concurrently
How you can chain behavior to the responses.
How you can use CompletableFuture in your design to create APIs that enable your users to get the most of your Component/library/module.
Servlet API life cycle methods
init(): called when servlet is instantiated; must return before any other methods will be called
service(): method called directly by server when an HTTP request is received; default service() method calls doGet() (or related methods covered later)
destroy(): called when server shuts down
MuleSoft Meetup Roma - Runtime Fabric Series (From Zero to Hero) - Sessione 2Alfonso Martino
Questa presentazione tratta le seguenti tematiche:
- Service discovery su Kubernetes (Service, Ingress Controller)
- Ingress Controller setup su EKS
- Ingress Controller Template setup su RTF
- Strategie di segregazione del traffico (interno ed esterno)
- Differenze tra RTF BYOK (Bring Your Own Kubernetes) e Self-managed
Dive into SObjectizer 5.5. Tenth part: Mutable MessagesYauheni Akhotnikau
This part describes a feature which was introduced in v.5.5.19: an ability to send mutable messages with guarantees that it will be delivered to at most one receiver.
Orchard is a free, open source, community-focused Content Management System built on the ASP.NET MVC platform. Software IP management and project development governance are provided by Outercurve Foundation, a nonprofit fund.
How to build to do app using vue composition api and vuex 4 with typescriptKaty Slemon
In this tutorial, we will build a to-do app using Vue Composition API & Vuex 4 with Typescript. We will learn and explore Composition API & Options API as well
Date Processing Attracts Bugs or 77 Defects in Qt 6Andrey Karpov
The recent Qt 6 release compelled us to recheck the framework with PVS-Studio. In this article, we reviewed various interesting errors we found, for example, those related to processing dates. The errors we discovered prove that developers can greatly benefit from regularly checking their projects with tools like PVS-Studio.
Testing RESTful Webservices using the REST-assured frameworkMicha Kops
The REST-assured framework and its features explained by example.
For detailed information please take a look at my full tutorial including the sources at http://www.hascode.com/2011/10/testing-restful-web-services-made-easy-using-the-rest-assured-framework/
In this talk we will take a deep dive into the inner workings of JavaScript. Scopes, functions, closures, and prototypes are just some of the most misunderstood terms in the JavaScript world. We will take a tour "behind the scenes" of JavaScript to learn how to write better code.
In this presentation, I'm covering the topics
Node Package Manager (npm)
initializing a node project
dependencies and dev dependencies
Installation, listing and uninstallation of node packages
Importing of modules
Leveraging Completable Futures to handle your query results AsynchrhonouslyDavid Gómez García
The challenges of developing applications recently have increased. With the popularity of cloud environments, the scalability required by new architectures and the need to support more load efficiently, there has been an increase in attention that we need to pay to concurrency and efficiency.
One strategy to achieve that efficiency consists of distributing the modules of your application in several different smaller components running concurrently. But one of the problems that arise from such distribution of running modules comes when you need to send a request (and wait for the response) to several different modules. How do you design that request(s)-response(s) to be as efficient as possible?
CompletableFutures was introduced with Java 8 but has evolved over the years with every new version of Java released. In this talk, we will take a look at it, to:
understand how to use CompletableFutures,
how they can help us to split our workload into different request and coordinate them asynchronously and concurrently
How you can chain behavior to the responses.
How you can use CompletableFuture in your design to create APIs that enable your users to get the most of your Component/library/module.
Servlet API life cycle methods
init(): called when servlet is instantiated; must return before any other methods will be called
service(): method called directly by server when an HTTP request is received; default service() method calls doGet() (or related methods covered later)
destroy(): called when server shuts down
MuleSoft Meetup Roma - Runtime Fabric Series (From Zero to Hero) - Sessione 2Alfonso Martino
Questa presentazione tratta le seguenti tematiche:
- Service discovery su Kubernetes (Service, Ingress Controller)
- Ingress Controller setup su EKS
- Ingress Controller Template setup su RTF
- Strategie di segregazione del traffico (interno ed esterno)
- Differenze tra RTF BYOK (Bring Your Own Kubernetes) e Self-managed
This talk cover the principles and the best practices in creation of flexible Microsoft .NET Core-based applications in connection with Microsoft Azure services, as well as tools and libraries that greatly simplify the development, configuration and deployment of applications. Also, attention paid to some pitfalls that may be encountered while using .NET Core.
This presentation by Andrii Antilikatorov, Consultant at GlobalLogic Kharkiv, was delivered at GlobalLogic Kharkiv MS TechTalk #2 on November 4, 2017.
Network Setup Guide: Deploying Your Cloudian HyperStore Hybrid Storage ServiceCloudian
This document is to help a new user set up the network when deploying a 3-node Cloudian storage cluster in your data center for use with the Cloudian HyperStore Hybrid Cloud Service from AWS Marketplace.
An introduction to the Docker concept. Experiences with ASP.NET Core and Docker, How Docker can help produce modular deployments for ASP.NET web applications. Presented at Vermont Code Camp #8, UVM, Burlington VT, September 17, 2016
An introduction to KrakenD, the ultra-high performance API Gateway with middlewares. An opensource tool built using go that is currently serving traffic in major european sites.
Monitors the external connection through Outlook Anywhere (RPC over HTTP Proxy) to Exchange mailing system. For more information visit the following webpage: http://pandorafms.com/index.php?sec=Library&sec2=repository&lng=es&action=view_PUI&id_PUI=571
HAProxy is often used to route ingress traffic, but we use it the other way around. We use it for egress. Our applications talk to the outside world through HAProxy. We get a lot of benefits from this unique approach: throttling, guaranteed response times, unified monitoring, and path rewriting. I will highlight how we use HAProxy at Inuits and how we achieve observability via Prometheus and Grafana.
DevOps Days Boston 2017: Real-world Kubernetes for DevOpsAmbassador Labs
DevOps Days Boston 2017
Microservices is an increasingly popular approach to building cloud-native applications. Dozens of new technologies that streamline adopting microservices development such as Docker, Kubernetes, and Envoy have been released over the past few years. But how do you actually use these technologies together to develop, deploy, and run microservices?
In this presentation, we’ll cover the nuances of deploying containerized applications on Kubernetes, including creating a Kubernetes manifest, debugging and logging, and how to build an automated continuous deployment pipeline. Then, we’ll do a brief tour of some of the advanced concepts related to microservices, including service mesh, canary deployments, resilience, and security.
Service discovery like a pro (presented at reversimX)Eran Harel
So you want to auto scale your services, and use service oriented architecture, eh?
Want to reduce the cost of managing your clusters, and discover them dynamically?
In this talk we shall see how consul helps you do that very efficiently, explain how it works, demonstrate spinning up several interconnected services, and show how we can achieve seamless discovery, HA, and fault tolerance.
Serverless Design Patterns (London Dev Community)Yan Cui
Serverless technologies like AWS Lambda has drastically simplified the task of building reactive systems - drop a file into S3 and a Lambda function would be triggered to process it, push an event into a Kinesis stream and magically it'll be processed by a Lambda function in real-time, you can even use Lambda to automate the process of auditing and securing your AWS account by automatically reacting to rule violations to your security policy.
Join us in this talk to see some architectural design patterns that have emerged with AWS Lambda, and learn how to pick the right event source based on the tradeoffs you want. Amongst the many patterns we'll explore, here are a few to whet your appetite : pub-sub, cron, push-pull, saga and decoupled invocation.
Similar to arataga. SObjectizer and RESTinio in action: a real-world example (20)
Actor Model and C++: what, why and how? (March 2020 Edition)Yauheni Akhotnikau
This is an updated version of slides from my talk on the C++ CoreHard Autumn 2016 conference.
The Actor Model which is currently trending in software development is a popular design approach when it comes to complex applications. Many systems are written in Erlang (Akka framework) are designed with the Actor Model in their core. But Erlang and Akka are managed environments and safe programming languages. Is it worth using the Actor Model in C++? If yes, where to look and what to use? The talk will cover all these topics.
Слайды одноименного доклада с конференции C++ CoreHard Autumn 2018 (г.Минск, 2018.11.03).
Краткое описание доклада:
На предыдущих конференциях C++ CoreHard автор доклада рассказывал про Модель Акторов и опыт ее использования в C++. Но Модель Акторов -- это далеко не единственный способ борьбы со сложностью при работе с многопоточностью. Давайте попробуем поговорить о том, что еще можно применить и как это может выглядеть в C++.
Shrimp: A Rather Practical Example Of Application Development With RESTinio a...Yauheni Akhotnikau
Description of a demo project for serving images by using Actor Model and embedded HTTP-server. This project is implemented in C++17 with SObjectizer and RESTinio (OpenSource products from stiffstream).
Акторы в C++: взгляд старого практикующего актородела (St. Petersburg C++ Use...Yauheni Akhotnikau
Автор доклада более 16 лет отвечает за развитие Open-Source фреймворка SObjectizer -- одного из немногих живых, эволюционирующих, кросс-платформенных фреймворков для C++, базирующихся на Модели Акторов. При этом SObjectizer никогда не был исследовательским экспериментом и с самого начала использовался в ряде business-critical проектов.
За годы разработки и эксплуатации SObjectizer накопился некоторый практический опыт использования акторов в С++, которым докладчик поделится со слушателями. Речь пойдет о том, почему Модель Акторов выглядит привлекательной, где и когда ее выгодно использовать. Какие особенности накладывает именно С++ и разумно ли использовать Модель Акторов в C++? Почему реализации Модели Акторов для C++ настолько разные и почему SObjectizer получился именно таким?
Слайды одноименного доклада с конференции "C++ Russia 2018". В докладе речь идет о том, насколько C++ мешает и насколько C++ помогает в разработке акторного фреймворка для C++.
GECon 2017: C++ - a Monster that no one likes but that will outlast them allYauheni Akhotnikau
Slides from my presentation from GECon-2017 conference: https://events.epam.com/events/gecon-2017
It covers the following topics:
A bit of C++ evolution history.
Why C++ became popular and why C++ started to lose its popularity.
Why C++ is a Monster? If C ++ is a monster, then why does someone need C++?
How to use C++ safely and efficiently?
Where and when C++ can be used. If it can...
Pressure to C++ from competitors. Real and imaginary.
Actor model which is currently trending in software development is a popular design approach when it comes to complex applications. Many systems written in Erlang (Akka framework) are designed with actor model in their core. But Erlang and Akka are managed environments and safe programming languages. Is it worth using actor model in C++? If yes, where to look and what to use? The talk will cover all these topics.
Слайды доклада на конференции C++ Corehard Winter 2017 (г.Минск).
Автор доклада давно и успешно использует Модель Акторов при разработке приложений на C++. В основном это был положительный опыт. Но есть некоторые неочевидные моменты, про которые было бы хорошо узнать заранее. О том, где использование Модели Акторов уместно, а где нет, на какие грабли довелось наступить, какие шишки были набиты, как можно упростить себе жизнь и пойдет речь в докладе.
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...Crescat
Crescat is industry-trusted event management software, built by event professionals for event professionals. Founded in 2017, we have three key products tailored for the live event industry.
Crescat Event for concert promoters and event agencies. Crescat Venue for music venues, conference centers, wedding venues, concert halls and more. And Crescat Festival for festivals, conferences and complex events.
With a wide range of popular features such as event scheduling, shift management, volunteer and crew coordination, artist booking and much more, Crescat is designed for customisation and ease-of-use.
Over 125,000 events have been planned in Crescat and with hundreds of customers of all shapes and sizes, from boutique event agencies through to international concert promoters, Crescat is rigged for success. What's more, we highly value feedback from our users and we are constantly improving our software with updates, new features and improvements.
If you plan events, run a venue or produce festivals and you're looking for ways to make your life easier, then we have a solution for you. Try our software for free or schedule a no-obligation demo with one of our product specialists today at crescat.io
Need for Speed: Removing speed bumps from your Symfony projects ⚡️Łukasz Chruściel
No one wants their application to drag like a car stuck in the slow lane! Yet it’s all too common to encounter bumpy, pothole-filled solutions that slow the speed of any application. Symfony apps are not an exception.
In this talk, I will take you for a spin around the performance racetrack. We’ll explore common pitfalls - those hidden potholes on your application that can cause unexpected slowdowns. Learn how to spot these performance bumps early, and more importantly, how to navigate around them to keep your application running at top speed.
We will focus in particular on tuning your engine at the application level, making the right adjustments to ensure that your system responds like a well-oiled, high-performance race car.
Launch Your Streaming Platforms in MinutesRoshan Dwivedi
The claim of launching a streaming platform in minutes might be a bit of an exaggeration, but there are services that can significantly streamline the process. Here's a breakdown:
Pros of Speedy Streaming Platform Launch Services:
No coding required: These services often use drag-and-drop interfaces or pre-built templates, eliminating the need for programming knowledge.
Faster setup: Compared to building from scratch, these platforms can get you up and running much quicker.
All-in-one solutions: Many services offer features like content management systems (CMS), video players, and monetization tools, reducing the need for multiple integrations.
Things to Consider:
Limited customization: These platforms may offer less flexibility in design and functionality compared to custom-built solutions.
Scalability: As your audience grows, you might need to upgrade to a more robust platform or encounter limitations with the "quick launch" option.
Features: Carefully evaluate which features are included and if they meet your specific needs (e.g., live streaming, subscription options).
Examples of Services for Launching Streaming Platforms:
Muvi [muvi com]
Uscreen [usencreen tv]
Alternatives to Consider:
Existing Streaming platforms: Platforms like YouTube or Twitch might be suitable for basic streaming needs, though monetization options might be limited.
Custom Development: While more time-consuming, custom development offers the most control and flexibility for your platform.
Overall, launching a streaming platform in minutes might not be entirely realistic, but these services can significantly speed up the process compared to building from scratch. Carefully consider your needs and budget when choosing the best option for you.
Essentials of Automations: The Art of Triggers and Actions in FMESafe Software
In this second installment of our Essentials of Automations webinar series, we’ll explore the landscape of triggers and actions, guiding you through the nuances of authoring and adapting workspaces for seamless automations. Gain an understanding of the full spectrum of triggers and actions available in FME, empowering you to enhance your workspaces for efficient automation.
We’ll kick things off by showcasing the most commonly used event-based triggers, introducing you to various automation workflows like manual triggers, schedules, directory watchers, and more. Plus, see how these elements play out in real scenarios.
Whether you’re tweaking your current setup or building from the ground up, this session will arm you with the tools and insights needed to transform your FME usage into a powerhouse of productivity. Join us to discover effective strategies that simplify complex processes, enhancing your productivity and transforming your data management practices with FME. Let’s turn complexity into clarity and make your workspaces work wonders!
Navigating the Metaverse: A Journey into Virtual Evolution"Donna Lenk
Join us for an exploration of the Metaverse's evolution, where innovation meets imagination. Discover new dimensions of virtual events, engage with thought-provoking discussions, and witness the transformative power of digital realms."
Atelier - Innover avec l’IA Générative et les graphes de connaissancesNeo4j
Atelier - Innover avec l’IA Générative et les graphes de connaissances
Allez au-delà du battage médiatique autour de l’IA et découvrez des techniques pratiques pour utiliser l’IA de manière responsable à travers les données de votre organisation. Explorez comment utiliser les graphes de connaissances pour augmenter la précision, la transparence et la capacité d’explication dans les systèmes d’IA générative. Vous partirez avec une expérience pratique combinant les relations entre les données et les LLM pour apporter du contexte spécifique à votre domaine et améliorer votre raisonnement.
Amenez votre ordinateur portable et nous vous guiderons sur la mise en place de votre propre pile d’IA générative, en vous fournissant des exemples pratiques et codés pour démarrer en quelques minutes.
May Marketo Masterclass, London MUG May 22 2024.pdfAdele Miller
Can't make Adobe Summit in Vegas? No sweat because the EMEA Marketo Engage Champions are coming to London to share their Summit sessions, insights and more!
This is a MUG with a twist you don't want to miss.
Utilocate offers a comprehensive solution for locate ticket management by automating and streamlining the entire process. By integrating with Geospatial Information Systems (GIS), it provides accurate mapping and visualization of utility locations, enhancing decision-making and reducing the risk of errors. The system's advanced data analytics tools help identify trends, predict potential issues, and optimize resource allocation, making the locate ticket management process smarter and more efficient. Additionally, automated ticket management ensures consistency and reduces human error, while real-time notifications keep all relevant personnel informed and ready to respond promptly.
The system's ability to streamline workflows and automate ticket routing significantly reduces the time taken to process each ticket, making the process faster and more efficient. Mobile access allows field technicians to update ticket information on the go, ensuring that the latest information is always available and accelerating the locate process. Overall, Utilocate not only enhances the efficiency and accuracy of locate ticket management but also improves safety by minimizing the risk of utility damage through precise and timely locates.
Do you want Software for your Business? Visit Deuglo
Deuglo has top Software Developers in India. They are experts in software development and help design and create custom Software solutions.
Deuglo follows seven steps methods for delivering their services to their customers. They called it the Software development life cycle process (SDLC).
Requirement — Collecting the Requirements is the first Phase in the SSLC process.
Feasibility Study — after completing the requirement process they move to the design phase.
Design — in this phase, they start designing the software.
Coding — when designing is completed, the developers start coding for the software.
Testing — in this phase when the coding of the software is done the testing team will start testing.
Installation — after completion of testing, the application opens to the live server and launches!
Maintenance — after completing the software development, customers start using the software.
AI Genie Review: World’s First Open AI WordPress Website CreatorGoogle
AI Genie Review: World’s First Open AI WordPress Website Creator
👉👉 Click Here To Get More Info 👇👇
https://sumonreview.com/ai-genie-review
AI Genie Review: Key Features
✅Creates Limitless Real-Time Unique Content, auto-publishing Posts, Pages & Images directly from Chat GPT & Open AI on WordPress in any Niche
✅First & Only Google Bard Approved Software That Publishes 100% Original, SEO Friendly Content using Open AI
✅Publish Automated Posts and Pages using AI Genie directly on Your website
✅50 DFY Websites Included Without Adding Any Images, Content Or Doing Anything Yourself
✅Integrated Chat GPT Bot gives Instant Answers on Your Website to Visitors
✅Just Enter the title, and your Content for Pages and Posts will be ready on your website
✅Automatically insert visually appealing images into posts based on keywords and titles.
✅Choose the temperature of the content and control its randomness.
✅Control the length of the content to be generated.
✅Never Worry About Paying Huge Money Monthly To Top Content Creation Platforms
✅100% Easy-to-Use, Newbie-Friendly Technology
✅30-Days Money-Back Guarantee
See My Other Reviews Article:
(1) TubeTrivia AI Review: https://sumonreview.com/tubetrivia-ai-review
(2) SocioWave Review: https://sumonreview.com/sociowave-review
(3) AI Partner & Profit Review: https://sumonreview.com/ai-partner-profit-review
(4) AI Ebook Suite Review: https://sumonreview.com/ai-ebook-suite-review
#AIGenieApp #AIGenieBonus #AIGenieBonuses #AIGenieDemo #AIGenieDownload #AIGenieLegit #AIGenieLiveDemo #AIGenieOTO #AIGeniePreview #AIGenieReview #AIGenieReviewandBonus #AIGenieScamorLegit #AIGenieSoftware #AIGenieUpgrades #AIGenieUpsells #HowDoesAlGenie #HowtoBuyAIGenie #HowtoMakeMoneywithAIGenie #MakeMoneyOnline #MakeMoneywithAIGenie
Enterprise Resource Planning System includes various modules that reduce any business's workload. Additionally, it organizes the workflows, which drives towards enhancing productivity. Here are a detailed explanation of the ERP modules. Going through the points will help you understand how the software is changing the work dynamics.
To know more details here: https://blogs.nyggs.com/nyggs/enterprise-resource-planning-erp-system-modules/
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...Mind IT Systems
Healthcare providers often struggle with the complexities of chronic conditions and remote patient monitoring, as each patient requires personalized care and ongoing monitoring. Off-the-shelf solutions may not meet these diverse needs, leading to inefficiencies and gaps in care. It’s here, custom healthcare software offers a tailored solution, ensuring improved care and effectiveness.
Quarkus Hidden and Forbidden ExtensionsMax Andersen
Quarkus has a vast extension ecosystem and is known for its subsonic and subatomic feature set. Some of these features are not as well known, and some extensions are less talked about, but that does not make them less interesting - quite the opposite.
Come join this talk to see some tips and tricks for using Quarkus and some of the lesser known features, extensions and development techniques.
A Study of Variable-Role-based Feature Enrichment in Neural Models of CodeAftab Hussain
Understanding variable roles in code has been found to be helpful by students
in learning programming -- could variable roles help deep neural models in
performing coding tasks? We do an exploratory study.
- These are slides of the talk given at InteNSE'23: The 1st International Workshop on Interpretability and Robustness in Neural Software Engineering, co-located with the 45th International Conference on Software Engineering, ICSE 2023, Melbourne Australia
Graspan: A Big Data System for Big Code AnalysisAftab Hussain
We built a disk-based parallel graph system, Graspan, that uses a novel edge-pair centric computation model to compute dynamic transitive closures on very large program graphs.
We implement context-sensitive pointer/alias and dataflow analyses on Graspan. An evaluation of these analyses on large codebases such as Linux shows that their Graspan implementations scale to millions of lines of code and are much simpler than their original implementations.
These analyses were used to augment the existing checkers; these augmented checkers found 132 new NULL pointer bugs and 1308 unnecessary NULL tests in Linux 4.4.0-rc5, PostgreSQL 8.3.9, and Apache httpd 2.2.18.
- Accepted in ASPLOS ‘17, Xi’an, China.
- Featured in the tutorial, Systemized Program Analyses: A Big Data Perspective on Static Analysis Scalability, ASPLOS ‘17.
- Invited for presentation at SoCal PLS ‘16.
- Invited for poster presentation at PLDI SRC ‘16.
OpenMetadata Community Meeting - 5th June 2024OpenMetadata
The OpenMetadata Community Meeting was held on June 5th, 2024. In this meeting, we discussed about the data quality capabilities that are integrated with the Incident Manager, providing a complete solution to handle your data observability needs. Watch the end-to-end demo of the data quality features.
* How to run your own data quality framework
* What is the performance impact of running data quality frameworks
* How to run the test cases in your own ETL pipelines
* How the Incident Manager is integrated
* Get notified with alerts when test cases fail
Watch the meeting recording here - https://www.youtube.com/watch?v=UbNOje0kf6E
Transform Your Communication with Cloud-Based IVR SolutionsTheSMSPoint
Discover the power of Cloud-Based IVR Solutions to streamline communication processes. Embrace scalability and cost-efficiency while enhancing customer experiences with features like automated call routing and voice recognition. Accessible from anywhere, these solutions integrate seamlessly with existing systems, providing real-time analytics for continuous improvement. Revolutionize your communication strategy today with Cloud-Based IVR Solutions. Learn more at: https://thesmspoint.com/channel/cloud-telephony
3. What is 'arataga'
arataga is a fully working prototype of performant socks5+http/1.1 proxy server
targeted a case when thousands of entry points have to be opened.
3
4. A way to open source
arataga was in development in the summer of 2020 by stiffsteam for a customer
who wanted to replace its own old proxy server.
For some reason, the customer abandoned the project.
But almost all functionality we wanted to have was already implemented, so we
decided to open source arataga.
4
5. Why we open sourced aragata?
It's a shame to throw away a product that our hard work was put into.
Maybe the results of our work will be useful for somebody.
It's also a perfect showcase of how we write code using SObjectizer and
RESTinio.
5
8. Projects requirements
● thousands of entry-points (unique pairs of IP-address+TCP-port).
At least 8K entry-points should have been supported at the beginning;
● tens of thousands of users can work with the proxy simultaneously (40K
parallel connections is a normal workload);
● user connections/disconnections at the rate of 1,000+ new connections per
second;
● bandwidth had to be limited for client connections, including limits for a
particular domains;
● the configuration and lists of allowed users must be received
via a special HTTP entry point.
8
9. Multithreading or multiprocessing
Tens of thousands of connections are expected. They hardly be handled in a
single-thread application.
We didn't go in the multiprocess application direction: too many IPC was required
for controlling child processes and collecting the monitoring info.
We decided to build a multithreaded application with several worker threads that
serve connections.
9
10. Multithreading model
The old proxy server used by the customer adopts the thread-per-connection
model.
It doesn't work well when there are more than 30K connections.
So we chose something like the thread-per-core model:
● (nCPU-2) threads allocated for serving connections. We call them io_threads;
● there are also several service threads for working with configuration and so
on.
10
11. Admin HTTP-entry
One of the service threads is dedicated to handling the admin HTTP-entry point.
That HTTP-entry point is used for accepting a new config and/or new list of
allowed users and their parameters.
That HTTP-entry point is also used for retrieving the current stats from the proxy
server.
11
12. What's next?
The next part of this presentation tells about the usage of SObjectizer to simplify
multithreading.
Then we'll talk about the usages of RESTinio, some of that could be somewhat
surprising.
12
14. Raw multithreading is a pain
Dealing with raw multithreading in C++ is a straight way to various problems.
We prefer to use more high-level approaches like Actors or CSP.
That is why we developed and maintain SObjectizer that allows us to use Actors
and CSP when we need it.
14
15. Actors were an obvious choice for aragata
SObjectizer supports Actors and CSP models but in the case of arataga the choice
was clearly obvious.
We have to deal with a large number of independent objects with their own state
and logic.
Those objects required async interaction between each other.
That's an ideal use-case for actors.
15
16. Types of actors in arataga
There are a few types of actors (agents) in arataga:
● startup_manager;
● config_manager;
● user_list_manager;
● authentificator;
● dns_resolver;
● acl_handler.
16
17. startup_manager agent
startup_manager is used only at the start up.
It creates config_manager and user_list_manager agents.
Then launches RESTinio-based server for admin HTTP-entry.
17
18. config_manager agent
Tries to load local copy of the config at the start up.
Handles updates for the config from admin HTTP-entry.
Creates instances of asio_one_thread dispatches, creates and binds
authenificator and dns_resolver agents.
Creates and destroys acl_handler agents.
18
19. user_list_manager agent
Tries to load local copy of the user-list at the start up.
Handles updates for the user-list from admin HTTP-entry.
Distributes updated versions of user-list to make them available for authentificator
agents.
19
21. dns_resolver agent
Services DNS lookup requests for acl_handler agents.
There is a separate dns_resolver*
agent for every io_thread.
21
*
there is no such agent as dns_resolver since v.0.4, now it's a coop of several agents. We'll see that later
22. acl_handler agent
Services a single entry-point:
● creates an incoming socket for specified IP-address and TCP-port;
● accepts new connections for that entry-point (stops accepting when there are
too many parallel connections);
● handles all accepted connections and all outgoing connection to target hosts.
22
23. Worker threads
There is no manual work with threads in aragata.
All worker threads required for aragata's agents are automatically created and
destroyed by SObjectizer. It's done by SObjectizer's dispatchers.
23
24. Dispatchers used in arataga
arataga uses two types of dispatchers:
● one_thread from SObjectizer's core. config_manager and user_list_manager
are bound to instances of that dispatcher type;
● asio_one_thread from so5extra companion project. authentificator,
dns_resolver and acl_handler agents are bound to instances of that
dispatcher type.
24
26. What is asio_one_thread dispatcher?
This dispatcher holds an instance of asio::io_context object.
The dispatcher starts a new thread and calls asio::io_context::run on it.
All events of agents bound to that dispatcher are scheduled via asio::post.
That allows agents to use Asio's calls (like async_accept, async_read,
async_write) directly in their event handlers.
This feature is critical for dns_resolver and acl_handler agents.
26
27. config_manager controls asio_one_thread disps
config_manager creates all necessary instances of asio_one_thread dispatchers
at the start up.
config_manager holds references to them and uses them to bind new instances of
acl_handler agents.
It can be seen as a table inside config_manager where a column describes one
io_thread.
27
31. The role of acl_handler agent
Services a single entry-point:
● creates an incoming socket for specified IP-address and TCP-port;
● accepts new connections for that entry-point (stops accepting when there are
too many parallel connections);
● reads initial data from accepted connection, detects the client's protocol;
● handles incoming commands from client and establishes outgoing
connections to target hosts;
● transfers data between clients and target hosts.
31
32. We had plenty of choices:
1. An agent that serves a group of entry points with all related connections.
2. An agent that serves single entry point and all related connections.
3. An agent that serves single entry point and an agent that serves a pair of
incoming/outgoing connections.
4. An agent that serves single entry point, an agent for incoming connection, an
agent for outgoing connection.
5. An agent that serves a group of entry points, an agent for incoming
connection, an agent for outgoing connection.
6. ...
Why an agent for entry point?
32
33. ...that serves also all related connections (incoming to that entry point, and
outgoing from that entry point).
The main reason: simplicity.
It's easy to delete entry point when it is removed from the config.
We decided to have an agent for entry point...
33
34. Too many agents in an application is not a good thing. It's hard to monitor and
debug program with 40K live agents inside.
Creation and deletion of agents is more expensive operation than creation and
deletion of more lightweight objects that we call connection_handler.
So in arataga an acl_handler agent owns many connection_handler objects.
An instance of connection_handler owns a pair of in/out connections.
connection_handler is created when acl_handler accepts new connection and is
destroyed when that connection is being closed.
No separate agents for in/out connections
34
36. We have a pair of authentificator/dns_resolver agents on every io_thread.
It's an attempt to improve locality.
An acl_handler agent on an io_thread interacts only with authentificator and
dns_resolver agents from the same io_thread.
There is no need to exchange any data between io_threads to serve client
requests.
Why there are several authentificator/dns_resolvers?
36
37. config_manager handles updated configs and distributes new info to all interested
agents (acl_handlers, authentificators, dns_resolvers).
user_list_manager handles updated user-list and distributes new info to all
authentificator agents.
That distribution is performed by SObjectizer's many-producer/many-consumer
message box.
Distribution of updated configs/user-lists
37
38. config_managers sends updates to config_updates_mbox and those updates are
received by all subscribers of that mbox:
Config updates distribution scheme
38
39. retained_mbox is used for config updates
A special kind of message box is used as config_updates_mbox: retained_mbox
from the so5extra companion project.
That type of mbox holds a copy of the last message sent.
When a new subscriber arrives, that last copy is being automatically sent to it.
That way, new acl_handler agents automatically get the latest configuration.
39
40. dns_resolver is a coop of several agents
We rewrote interaction with DNS name servers in v.0.4 and since then there are
several agents that play the role of dns_resolver.
All other agents in arataga didn't see that change because all interactions are
done via separate interface mbox.
40
42. acl_handlers know only interface mbox
All acl_handler-agents know only the interface mbox of dns_resolver part.
No one knows what's behind that mbox.
That allowed us to replace a_dns_resolver with a couple of new agents:
● a_collector that collects incoming resolve requests, queues them, holds the
results cache;
● a_nameserver_interactor that performs actual interaction with name servers
using UDP protocol.
No changes were made for acl_handler during that refactoring.
42
44. There are two a_collector actually...
Actually, every dns_resolver part holds two a_collector agents.
One handles requests for IPv4 addresses, another for IPv6.
But they are subscribed to a single source of resolve_request_t messages.
The separation of incoming message flows is done via SObjectizer's delivery
filters.
44
47. RESTinio in arataga: three use cases
We'll see three use cases for RESTinio in arataga.
One is obvious.
The second is not so.
The last is very surprised even for us.
47
48. An obvious use case: admin HTTP-entry
Admin HTTP-entry in arataga is implemented via RESTinio.
This entry-point accepts and handles GET and POST requests.
Every request should have a special Arataga-Admin-Token header field.
48
50. Admin HTTP-entry: launching
struct server_traits_t : public restinio::default_traits_t
{
// There are only three handlers in the chain:
// - checks for admin-token;
// - checks for content-type for POST-requests;
// - actual handling.
using request_handler_t = restinio::sync_chain::fixed_size_chain_t< 3>;
};
50
52. Admin HTTP-entry: interaction with agents
RESTinio server doesn't know about agents.
Agents don't know about RESTinio.
Interaction is performed via two special interfaces...
52
53. Admin HTTP-entry: interaction with agents
class replier_t {
public:
virtual ~replier_t();
virtual void reply( status_t status, std::string body ) = 0;
};
53
55. Admin HTTP-entry: interaction with agents
RESTinio's part has an actual implementation of replier_t interface.
SObjectizer's part has an actual implementation of request_mailbox_t interface.
55
56. Admin HTTP-entry: interaction with agents
When HTTP-entry accepts a new request it creates an instance of replier_t and
calls appropriate request_mailbox_t's method.
For example, when a new config is received the new_config() method is called.
The actual implementation of new_config() send a message to the
config_processor agent.
The config_processor handles new config and calls replier_t::reply() method.
56
58. Not obvious, but expected use case: HTTP-headers
We didn't plan to use RESTinio for serving incoming HTTP connections.
It's because the current version of RESTinio loads the whole request into the
memory and only then allows to handle the request.
That approach can't be used in proxy where a lot of large incoming requests have
to be handled without affecting the performance and resource usage.
But we hoped that some parts of RESTinio could simplify our work...
58
59. Not obvious, but expected use case: HTTP-headers
RESTinio has tools for working with HTTP header fields.
Those tools were reused in arataga.
59
60. Not obvious, but expected use case: HTTP-headers
RESTinio's http_header_fields_t container is used for holding headers:
struct request_info_t
{
//! HTTP-method of the request.
/*!
* It is stored here to be easily accessible.
*/
http_method m_method;
//! The value of request-target from the start-line.
std::string m_request_target;
//! Extracted HTTP header fields from the incoming request.
restinio::http_header_fields_t m_headers;
...
60
61. Not obvious, but expected use case: HTTP-headers
Not only for holding headers, but also for handling them:
// If there are more than one Host header fields then the request
// should be rejected. So count the fields.
std::optional< std::string_view > opt_host;
std::size_t host_occurrences{ 0u };
m_request_info. m_headers.for_each_value_of(
restinio::http_field_t::host,
[&]( std::string_view value )
{
++host_occurrences;
if( 1u == host_occurrences ) { opt_host = value; }
return restinio::http_header_fields_t::continue_enumeration();
} );
61
62. Not obvious, but expected use case: HTTP-headers
RESTinio's http_field_parsers are used for parsing headers:
#include <restinio/helpers/http_field_parsers/authorization.hpp>
#include <restinio/helpers/http_field_parsers/basic_auth.hpp>
...
using namespace restinio::http_field_parsers;
const auto auth_value_result = authorization_value_t::try_parse( *opt_proxy_auth_value );
if( !auth_value_result )
return username_password_extraction_failure_t{
make_error_description( auth_value_result.error(), *opt_proxy_auth_value )
};
...
auto basic_auth_result = basic_auth::try_extract_params( auth_value );
if( !basic_auth_result )
return username_password_extraction_failure_t{
fmt::format( "basic-auth param extraction failed: {}" ,
static_cast<int>(basic_auth_result.error()) )
};
62
63. Totally unexpected use case: config parsing
We have to parse a couple of config files with custom syntax.
That syntax wasn't too complex in general, but the standard C++ library totally
lacks any useful tools for such a task :(
Moreover, we wanted to make the syntax more user-friendly. For example, we
wanted to have an ability to write like that:
acl.io.chunk_size 16kib # Instead of 16384
timeout.authentification 12s # Instead of 12000
dns_cache_cleanup_period 6min # Instead of 360
63
64. Totally unexpected use case: config parsing
We solved that task by using RESTinio's easy_parser that is used in RESTinio for
parsing HTTP header fields.
As an example we'll show how values like 1min, or 25s, or 125ms are parsed...
64
65. An example of RESTinio-based parser (1)
Factory for parsers of time-out values:
/*!
* @brief A producer for easy_parser that extracts time-out values
* with possible suffixes (ms, s, min).
*/
[[nodiscard]] static auto timeout_value_p()
{
struct tmp_value_t
{
std:: int_least64_t m_count{ 0 };
int m_multiplier{ 1000 };
};
using namespace restinio::http_field_parsers;
using std::chrono::milliseconds;
65
69. Unfortunately, arataga wasn't stress-tested enough
Because the customer lost interest in the project, the arataga wasn't stress-tested
under the huge loads.
Only a few stress tests were performed.
In config and load dependency, arataga used from 1.5 to 4 times less CPU
consumption than the customer's old proxy server under the same workload.
69
70. The current status
The active development of arataga was suspended in 2020.
We ourselves consider arataga to be an excellent testing ground for the
approbation of new versions of SObjectizer and RESTinio in real-life conditions.
So we make some changes to arataga from time to time when we have some new
idea.
We also fix issues when someone reports them. If you find a problem in arataga
feel free to open an issue on GitHub.
70
71. Our own impressions: RESTinio
71
The use of RESTinio in arataga gave us some ideas for new RESTinio's features.
One of them, chain of synchronous handlers, was implemented and available
since RESTinio-0.6.13.
Others still wait their time...
72. Our own impressions: SObjectizer
Usual routine, nothing exciting, no challenges.
We took SObjectizer, wrote several agents, and that's all.
SObjectizer just works. There weren't any SObjectizer's or multithreading-related
issues.
72