SlideShare a Scribd company logo
1 of 84
Download to read offline
Monolit Mikroserwisy
JEDNO
NARZĘDZIE,
KTÓRE
ROZWIĄŻE TWOJE
PROBLEMY Z
MIKROSERWISAMI
ZOBACZ MEMY >>
źródło obrazka: https://thenounproject.com/term/poop/43299/
Jedno narzędzie, które rozwiąże twoje problemy z mikroserwisami
I DOSTARCZY NOWYCH
źródło: pixabay.com
Krzysztof „Jakub” Sikora
 Programuję w chmurze
 Prelegent / szkoleniowiec
 dostarczajwartość.pl / gruba.it
Dlaczego mikroserwisy mogą boleć?
źródło: https://pl.pinterest.com/pin/169940585924496451/
Komunikacja
źródło: pixabay.com
Diagnostyka
źródło: pixabay.com
Zdalny stan
źródło: https://www.imperva.com/blog/2017/12/database-security-at-cloud-scale/
Żeby tak mieć narzędzie, które pasuje do mikroserwisów
Service Fabric – “Microservices SDK”
Komunikacja w
monolicie
Monolit
DoSomething();
DoOtherThing();
Komunikacja w
architekturze
mikroserwisów
Performance
Komunikacja w
architekturze
mikroserwisów
Fault tolerance
Fallacies of distributed computing
Uproszczona
architektura
systemu
Tu ktoś coś
zepsuł
Skąd się bierze problem?
źródło: pixabay.com
Jako programiści sami musimy o wszystko zadbać
źródło: pixabay.com
Jakie są skutki?
Męczymy się i tracimy czas, zamiast skupić się na prawdziwym problemie
źródło:
Jak Service Fabric rozwiązuje problem komunikacyjne?
źródło: buildazure.com
var myServicePartitionClient = new ServicePartitionClient<MyCommunicationClient>(
_myCommunicationClientFactory,
"fabric:/MyApp/MyService",
myPartitionKey);
var result = await myServicePartitionClient.InvokeWithRetryAsync(async (client) => {
// Communicate!
}, CancellationToken.None);
IMyService myService =
ServiceProxy.Create<IMyService>(new Uri("fabric:/MyApp/MyService"));
await myService.HelloWorldAsync();
Komunikacja w Service Fabric
 Exception Handling
 Konfigurowalny retry
 Wygodne, gotowe i optymalne rozwiązanie dla wielu protokołów
źródło: buildazure.com
Jak tego użyć w praktyce?
źródło: pixabay.com
internal sealed class MyService : StatelessService, IMyService
{
public Supervisor(StatelessServiceContext context)
: base(context)
{}
public async Task HelloWorldAsync()
{
//do something
}
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
return new[] { new ServiceInstanceListener(CreateServiceRemotingListener) };
}
protected override async Task RunAsync(CancellationToken cancellationToken)
{
while (true)
{
cancellationToken.ThrowIfCancellationRequested();
await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
}
}
}
internal sealed class MyService : StatelessService, IMyService
{
public Supervisor(StatelessServiceContext context)
: base(context)
{}
public async Task HelloWorldAsync()
{
//do something
}
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
return new[] { new ServiceInstanceListener(CreateServiceRemotingListener) };
}
protected override async Task RunAsync(CancellationToken cancellationToken)
{
while (true)
{
cancellationToken.ThrowIfCancellationRequested();
await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
}
}
}
internal sealed class MyService : StatelessService, IMyService
{
public Supervisor(StatelessServiceContext context)
: base(context)
{}
public async Task HelloWorldAsync()
{
//do something
}
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
return new[] { new ServiceInstanceListener(CreateServiceRemotingListener) };
}
protected override async Task RunAsync(CancellationToken cancellationToken)
{
while (true)
{
cancellationToken.ThrowIfCancellationRequested();
await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
}
}
}
internal sealed class MyService : StatelessService, IMyService
{
public Supervisor(StatelessServiceContext context)
: base(context)
{}
public async Task HelloWorldAsync()
{
//do something
}
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
return new[] { new ServiceInstanceListener(CreateServiceRemotingListener) };
}
protected override async Task RunAsync(CancellationToken cancellationToken)
{
while (true)
{
cancellationToken.ThrowIfCancellationRequested();
await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<ServiceManifest Name="MyService"
Version="1.0"
xmlns="http://schemas.microsoft.com/2011/01/fabric"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ServiceTypes>
<StatelessServiceType ServiceTypeName="MyServiceType" />
</ServiceTypes>
<CodePackage Name="Code" Version="1.0">
<EntryPoint>
<ExeHost>
<Program>MyService.exe</Program>
</ExeHost>
</EntryPoint>
</CodePackage>
<ConfigPackage Name="Config" Version="1.0" />
<Resources>
<Endpoints>
<Endpoint Name="WebServiceEndpoint" Protocol="http" Port="80" />
<Endpoint Name="OtherServiceEndpoint" Protocol="tcp" Port="8505" />
</Endpoints>
</Resources>
</ServiceManifest>
<?xml version="1.0" encoding="utf-8"?>
<ServiceManifest Name="MyService"
Version="1.0"
xmlns="http://schemas.microsoft.com/2011/01/fabric"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ServiceTypes>
<StatelessServiceType ServiceTypeName="MyServiceType" />
</ServiceTypes>
<CodePackage Name="Code" Version="1.0">
<EntryPoint>
<ExeHost>
<Program>MyService.exe</Program>
</ExeHost>
</EntryPoint>
</CodePackage>
<ConfigPackage Name="Config" Version="1.0" />
<Resources>
<Endpoints>
<Endpoint Name="WebServiceEndpoint" Protocol="http" Port="80" />
<Endpoint Name="OtherServiceEndpoint" Protocol="tcp" Port="8505" />
</Endpoints>
</Resources>
</ServiceManifest>
<?xml version="1.0" encoding="utf-8"?>
<ServiceManifest Name="MyService"
Version="1.0"
xmlns="http://schemas.microsoft.com/2011/01/fabric"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ServiceTypes>
<StatelessServiceType ServiceTypeName="MyServiceType" />
</ServiceTypes>
<CodePackage Name="Code" Version="1.0">
<EntryPoint>
<ExeHost>
<Program>MyService.exe</Program>
</ExeHost>
</EntryPoint>
</CodePackage>
<ConfigPackage Name="Config" Version="1.0" />
<Resources>
<Endpoints>
<Endpoint Name="WebServiceEndpoint" Protocol="http" Port="80" />
<Endpoint Name="OtherServiceEndpoint" Protocol="tcp" Port="8505" />
</Endpoints>
</Resources>
</ServiceManifest>
<?xml version="1.0" encoding="utf-8"?>
<ServiceManifest Name="MyService"
Version="1.0"
xmlns="http://schemas.microsoft.com/2011/01/fabric"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ServiceTypes>
<StatelessServiceType ServiceTypeName="MyServiceType" />
</ServiceTypes>
<CodePackage Name="Code" Version="1.0">
<EntryPoint>
<ExeHost>
<Program>MyService.exe</Program>
</ExeHost>
</EntryPoint>
</CodePackage>
<ConfigPackage Name="Config" Version="1.0" />
<Resources>
<Endpoints>
<Endpoint Name="WebServiceEndpoint" Protocol="http" Port="80" />
<Endpoint Name="OtherServiceEndpoint" Protocol="tcp" Port="8505" />
</Endpoints>
</Resources>
</ServiceManifest>
Co trzeba zrobić, żeby zacząć korzystać z komunikacji w SF?
 [W przypadku SF Remoting] Nuget: Install-Package Microsoft.ServiceFabric.Services.Remoting
 Dodanie listenera do klasy Service’u
 Dodanie endpointa w konfiguracji
źródło: pixabay.com
Potem abstrakcja, DI i można używać
źródło: pixabay.com
Uproszczona
architektura
systemu
Dlaczego tyle trwało znalezienie tego błędu w komunikacji?
źródło: pixabay.com
Dlaczego pomimo kiepskiej diagnostyki udało się go znaleźć?
źródło: imgur.com
ffffasfasfas
Jacob, do you know what is
the cause of this error?
Jak Service Fabric chroni nas przed łzami?
źródło: buildazure.com
Service Fabric Explorer
Szybkie logowanie z ETW
Jak to wykorzystać w projekcie?
źródło: pixabay.com
Service Fabric Explorer przychodzi od razu lokalnie i na innych środowiskach
źródło: pixabay.com
Application Insights
Log Analytics
(Gotowy
template na
Azure)
Czy to w ogóle działa?
źródło: pixabay.com
Storage Account
Application
Insights
źródło: https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-diagnostics-event-analysis-appinsights
Uproszczona
architektura
systemu
Nowy system
Uproszczona
architektura
systemu
Nowy system
Cache
Jak zrobić cache w skalowalnych, bezstanowych serwisach?
źródło: moneyinc.com
Może Redis?
Może Redis?
 Drogi (4 środowiska)
 Dodatkowa zależność
 Trzeba poświecić czas
na dodatkową integrację
Inne rozwiązanie? STANOWE serwisy w Service Fabric
źródło: buildazure.com
Czym jest stanowy serwis?
Jak oprócz zwykłego cache można je wykorzystać?
źródło: pixabay.com
Co dają stanowe serwisy w Service Fabric?
 Bardzo szybkie
 Brak dodatkowych zależności
 Zintegrowane z ekosystemem
źródło: pixabay.com
Jak użyć tej wspaniałości?
źródło: pixabay.com
internal sealed class TestService : StatefulService, IMyService
{
private IReliableDictionary<string, string> _someCache;
private const string CacheName = "SomeCache";
public Test(StatefulServiceContext context, IReliableDictionary<string, string> someCache)
: base(context)
{
_someCache = someCache;
}
public async Task<string> GetValue(string key) {...}
protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
=> new ServiceReplicaListener[0];
protected override async Task RunAsync(CancellationToken cancellationToken)
{
_someCache = await StateManager.GetOrAddAsync<IReliableDictionary<string, string>>(CacheName);
while (true)
{
cancellationToken.ThrowIfCancellationRequested();
await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
}
}
}
internal sealed class TestService : StatefulService, IMyService
{
private IReliableDictionary<string, string> _someCache;
private const string CacheName = "SomeCache";
public Test(StatefulServiceContext context, IReliableDictionary<string, string> someCache)
: base(context)
{
_someCache = someCache;
}
public async Task<string> GetValue(string key) {...}
protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
=> new ServiceReplicaListener[0];
protected override async Task RunAsync(CancellationToken cancellationToken)
{
_someCache = await StateManager.GetOrAddAsync<IReliableDictionary<string, string>>(CacheName);
while (true)
{
cancellationToken.ThrowIfCancellationRequested();
await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
}
}
}
public async Task<string> GetValue(string key)
{
using (ITransaction transaction = StateManager.CreateTransaction())
{
bool valueCached = await _someCache.ContainsKeyAsync(transaction, key);
if (!valueCached)
{
return GetFromOldDb(key);
}
ConditionalValue<string> cachedValue = await _someCache.TryGetValueAsync(transaction, key);
return cachedValue.HasValue
? GetFromOldDb(key)
: cachedValue.Value;
}
}
Jak się komunikować z serwisem?
źródło: pixabay.com
IMyService myService =
ServiceProxy.Create<IMyService>(new Uri("fabric:/MyApp/MyService"));
string value = await myService.GetValue("key");
Uzywając pierwszej z metod komunikacji w Service Fabric
var myServicePartitionClient = new ServicePartitionClient<MyCommunicationClient>(
_myCommunicationClientFactory,
"fabric:/MyApp/MyService",
myPartitionKey);
var result = await myServicePartitionClient.InvokeWithRetryAsync(async (client) => {
await client.GetValueAsync("key");
}, CancellationToken.None);
Uzywając drugiej z metod komunikacji w Service Fabric
var myServicePartitionClient = new ServicePartitionClient<MyCommunicationClient>(
_myCommunicationClientFactory,
"fabric:/MyApp/MyService",
myPartitionKey);
var result = await myServicePartitionClient.InvokeWithRetryAsync(async (client) => {
await client.GetValueAsync("key");
}, CancellationToken.None);
Uzywając drugiej z metod komunikacji w Service Fabric
Architektura mikroserwisów sprawiała nam sporo problemów
źródło: pixabay.com
Service Fabric eliminuje wiele problemów i odpowiedzialności
źródło: buildazure.com
Po wypuszczeniu SF na produkcję
 Mieliśmy czas na rozwijanie istniejącego systemu (i migracje starego)
 Klient jest zadowolony i uważa że nie zmarnowaliśmy jego pieniądzy
 Mamy o czym opowiadać na konferencjach i meetupach
źródło: buildazure.com
Jak zacząć nastepny projekt w Service Fabric?
 Service Fabric SDK i rozszerzenie Azure doVS
 Wybierz template, który Cię interesuje
 Zacznij pisać – gotowy przykład u mnie na blogu
źródło: buildazure.com
https://codesenpai.humanaction.eu/service-fabric
codesenpai.humanaction.eu/service-fabric
dostarczajwartosc.pl
ksikora@future-processing.com
źródło: pixabay.com
[JuraSIC! Meetup] Krzysztof Sikora- Jak Service Fabric rozwiąże twoje problemy z mikroserwisami?

More Related Content

Similar to [JuraSIC! Meetup] Krzysztof Sikora- Jak Service Fabric rozwiąże twoje problemy z mikroserwisami?

Wprowadzenie do Kubernetesa. K8S jako nowy Linux.
Wprowadzenie do Kubernetesa. K8S jako nowy Linux.Wprowadzenie do Kubernetesa. K8S jako nowy Linux.
Wprowadzenie do Kubernetesa. K8S jako nowy Linux.Wojciech Barczyński
 
Wykorzystanie chmury Microsoft Azure w scenariuszach dev&test
Wykorzystanie chmury Microsoft Azure w scenariuszach dev&testWykorzystanie chmury Microsoft Azure w scenariuszach dev&test
Wykorzystanie chmury Microsoft Azure w scenariuszach dev&testJarek Sokolnicki
 
Citrix NetScaler Gateway i Azure MFA
Citrix NetScaler Gateway i Azure MFACitrix NetScaler Gateway i Azure MFA
Citrix NetScaler Gateway i Azure MFAPawel Serwan
 
Jak stworzyć udany system informatyczny
Jak stworzyć udany system informatycznyJak stworzyć udany system informatyczny
Jak stworzyć udany system informatycznyqbeuek
 
PLNOG19 - Krzysztof Banel - Nowe modele bezpieczeństwa w sieciach SDN
PLNOG19 - Krzysztof Banel - Nowe modele bezpieczeństwa w sieciach SDNPLNOG19 - Krzysztof Banel - Nowe modele bezpieczeństwa w sieciach SDN
PLNOG19 - Krzysztof Banel - Nowe modele bezpieczeństwa w sieciach SDNPROIDEA
 
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...Tomasz Kopacz
 
Budowanie rozwiązań serverless w chmurze Azure
Budowanie rozwiązań serverless w chmurze AzureBudowanie rozwiązań serverless w chmurze Azure
Budowanie rozwiązań serverless w chmurze AzureSages
 
[CareerCon] as-a-Service czy Software Defined (PL)
[CareerCon] as-a-Service czy Software Defined (PL)[CareerCon] as-a-Service czy Software Defined (PL)
[CareerCon] as-a-Service czy Software Defined (PL)Jaroslaw Sobel
 
Michał Dec - Quality in Clouds
Michał Dec - Quality in CloudsMichał Dec - Quality in Clouds
Michał Dec - Quality in Cloudskraqa
 
Silverlight i PHP - jak budować interfejs nowoczesnych aplikacji internetowych?
Silverlight i PHP - jak budować interfejs nowoczesnych aplikacji internetowych?Silverlight i PHP - jak budować interfejs nowoczesnych aplikacji internetowych?
Silverlight i PHP - jak budować interfejs nowoczesnych aplikacji internetowych?PHPCon Poland
 
Xen desktop na platformie nutanix
Xen desktop na platformie nutanixXen desktop na platformie nutanix
Xen desktop na platformie nutanixPawel Serwan
 
Wprowadzenie do implementacji architektur plug-in w PHP
Wprowadzenie do implementacji architektur plug-in w PHPWprowadzenie do implementacji architektur plug-in w PHP
Wprowadzenie do implementacji architektur plug-in w PHPPHPCon Poland
 
Microservieces and their communication (RabbitMQ/SIDEKIQ)
Microservieces and their communication (RabbitMQ/SIDEKIQ)Microservieces and their communication (RabbitMQ/SIDEKIQ)
Microservieces and their communication (RabbitMQ/SIDEKIQ)infakt
 
Poland- Smart Client Technology - MTS 2005
Poland- Smart Client Technology - MTS 2005Poland- Smart Client Technology - MTS 2005
Poland- Smart Client Technology - MTS 2005Tomasz Cieplak
 
MvvmCross na przykładach w Xamarin.Android
MvvmCross na przykładach w Xamarin.AndroidMvvmCross na przykładach w Xamarin.Android
MvvmCross na przykładach w Xamarin.AndroidIn'saneLab
 
Co nowego w VS 2013 dla programistów ASP.NET?
Co nowego w VS 2013 dla programistów ASP.NET?Co nowego w VS 2013 dla programistów ASP.NET?
Co nowego w VS 2013 dla programistów ASP.NET?Bartlomiej Zass
 
Prostota i mozliwosci symfony2
Prostota i mozliwosci symfony2Prostota i mozliwosci symfony2
Prostota i mozliwosci symfony2Natalia Stanko
 
Aplikacje internetowe (2010)
Aplikacje internetowe (2010)Aplikacje internetowe (2010)
Aplikacje internetowe (2010)Adrian Kalbarczyk
 

Similar to [JuraSIC! Meetup] Krzysztof Sikora- Jak Service Fabric rozwiąże twoje problemy z mikroserwisami? (20)

Wprowadzenie do Kubernetesa. K8S jako nowy Linux.
Wprowadzenie do Kubernetesa. K8S jako nowy Linux.Wprowadzenie do Kubernetesa. K8S jako nowy Linux.
Wprowadzenie do Kubernetesa. K8S jako nowy Linux.
 
Wykorzystanie chmury Microsoft Azure w scenariuszach dev&test
Wykorzystanie chmury Microsoft Azure w scenariuszach dev&testWykorzystanie chmury Microsoft Azure w scenariuszach dev&test
Wykorzystanie chmury Microsoft Azure w scenariuszach dev&test
 
Citrix NetScaler Gateway i Azure MFA
Citrix NetScaler Gateway i Azure MFACitrix NetScaler Gateway i Azure MFA
Citrix NetScaler Gateway i Azure MFA
 
Jak stworzyć udany system informatyczny
Jak stworzyć udany system informatycznyJak stworzyć udany system informatyczny
Jak stworzyć udany system informatyczny
 
PLNOG19 - Krzysztof Banel - Nowe modele bezpieczeństwa w sieciach SDN
PLNOG19 - Krzysztof Banel - Nowe modele bezpieczeństwa w sieciach SDNPLNOG19 - Krzysztof Banel - Nowe modele bezpieczeństwa w sieciach SDN
PLNOG19 - Krzysztof Banel - Nowe modele bezpieczeństwa w sieciach SDN
 
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
 
Budowanie rozwiązań serverless w chmurze Azure
Budowanie rozwiązań serverless w chmurze AzureBudowanie rozwiązań serverless w chmurze Azure
Budowanie rozwiązań serverless w chmurze Azure
 
[CareerCon] as-a-Service czy Software Defined (PL)
[CareerCon] as-a-Service czy Software Defined (PL)[CareerCon] as-a-Service czy Software Defined (PL)
[CareerCon] as-a-Service czy Software Defined (PL)
 
Michał Dec - Quality in Clouds
Michał Dec - Quality in CloudsMichał Dec - Quality in Clouds
Michał Dec - Quality in Clouds
 
Silverlight i PHP - jak budować interfejs nowoczesnych aplikacji internetowych?
Silverlight i PHP - jak budować interfejs nowoczesnych aplikacji internetowych?Silverlight i PHP - jak budować interfejs nowoczesnych aplikacji internetowych?
Silverlight i PHP - jak budować interfejs nowoczesnych aplikacji internetowych?
 
Silverlight i PHP
Silverlight i PHPSilverlight i PHP
Silverlight i PHP
 
WF w zastosowaniach Web
WF w zastosowaniach WebWF w zastosowaniach Web
WF w zastosowaniach Web
 
Xen desktop na platformie nutanix
Xen desktop na platformie nutanixXen desktop na platformie nutanix
Xen desktop na platformie nutanix
 
Wprowadzenie do implementacji architektur plug-in w PHP
Wprowadzenie do implementacji architektur plug-in w PHPWprowadzenie do implementacji architektur plug-in w PHP
Wprowadzenie do implementacji architektur plug-in w PHP
 
Microservieces and their communication (RabbitMQ/SIDEKIQ)
Microservieces and their communication (RabbitMQ/SIDEKIQ)Microservieces and their communication (RabbitMQ/SIDEKIQ)
Microservieces and their communication (RabbitMQ/SIDEKIQ)
 
Poland- Smart Client Technology - MTS 2005
Poland- Smart Client Technology - MTS 2005Poland- Smart Client Technology - MTS 2005
Poland- Smart Client Technology - MTS 2005
 
MvvmCross na przykładach w Xamarin.Android
MvvmCross na przykładach w Xamarin.AndroidMvvmCross na przykładach w Xamarin.Android
MvvmCross na przykładach w Xamarin.Android
 
Co nowego w VS 2013 dla programistów ASP.NET?
Co nowego w VS 2013 dla programistów ASP.NET?Co nowego w VS 2013 dla programistów ASP.NET?
Co nowego w VS 2013 dla programistów ASP.NET?
 
Prostota i mozliwosci symfony2
Prostota i mozliwosci symfony2Prostota i mozliwosci symfony2
Prostota i mozliwosci symfony2
 
Aplikacje internetowe (2010)
Aplikacje internetowe (2010)Aplikacje internetowe (2010)
Aplikacje internetowe (2010)
 

More from Future Processing

DPTO_Inżynieria oprogramowania to proces uczenia się.pdf
DPTO_Inżynieria oprogramowania to proces uczenia się.pdfDPTO_Inżynieria oprogramowania to proces uczenia się.pdf
DPTO_Inżynieria oprogramowania to proces uczenia się.pdfFuture Processing
 
DPTO_QA w świecie wartości biznesowych.pdf
DPTO_QA w świecie wartości biznesowych.pdfDPTO_QA w świecie wartości biznesowych.pdf
DPTO_QA w świecie wartości biznesowych.pdfFuture Processing
 
DPTO_Hello_Clean_Architekture.pdf
DPTO_Hello_Clean_Architekture.pdfDPTO_Hello_Clean_Architekture.pdf
DPTO_Hello_Clean_Architekture.pdfFuture Processing
 
[Quality Meetup #20] Michał Górski - Continuous Deployment w chmurze
[Quality Meetup #20] Michał Górski - Continuous Deployment w chmurze[Quality Meetup #20] Michał Górski - Continuous Deployment w chmurze
[Quality Meetup #20] Michał Górski - Continuous Deployment w chmurzeFuture Processing
 
[Quality Meetup #20] Dorota Tadych - Hyperion - wystarczy jeden shake
[Quality Meetup #20] Dorota Tadych - Hyperion - wystarczy jeden shake[Quality Meetup #20] Dorota Tadych - Hyperion - wystarczy jeden shake
[Quality Meetup #20] Dorota Tadych - Hyperion - wystarczy jeden shakeFuture Processing
 
[Quality Meetup #19] Magdalena Drechsler-Nowak - Tester w pułapce myślenia
[Quality Meetup #19] Magdalena Drechsler-Nowak - Tester w pułapce myślenia[Quality Meetup #19] Magdalena Drechsler-Nowak - Tester w pułapce myślenia
[Quality Meetup #19] Magdalena Drechsler-Nowak - Tester w pułapce myśleniaFuture Processing
 
[Quality Meetup #19] Adrian Gonciarz - Testerska ruletka
[Quality Meetup #19] Adrian Gonciarz - Testerska ruletka[Quality Meetup #19] Adrian Gonciarz - Testerska ruletka
[Quality Meetup #19] Adrian Gonciarz - Testerska ruletkaFuture Processing
 
[FDD 2018] Ł. Turchan, A. Hulist, M. Duchnowski - CUDA - results over coffee ...
[FDD 2018] Ł. Turchan, A. Hulist, M. Duchnowski - CUDA - results over coffee ...[FDD 2018] Ł. Turchan, A. Hulist, M. Duchnowski - CUDA - results over coffee ...
[FDD 2018] Ł. Turchan, A. Hulist, M. Duchnowski - CUDA - results over coffee ...Future Processing
 
[FDD 2018] Lech Kalinowski - Prywatny Blockchain
[FDD 2018] Lech Kalinowski - Prywatny Blockchain[FDD 2018] Lech Kalinowski - Prywatny Blockchain
[FDD 2018] Lech Kalinowski - Prywatny BlockchainFuture Processing
 
[FDD 2018] W. Malara, K. Kotowski - Autoenkodery – czyli zalety funkcji F(X)≈X
[FDD 2018] W. Malara, K. Kotowski - Autoenkodery – czyli zalety funkcji F(X)≈X[FDD 2018] W. Malara, K. Kotowski - Autoenkodery – czyli zalety funkcji F(X)≈X
[FDD 2018] W. Malara, K. Kotowski - Autoenkodery – czyli zalety funkcji F(X)≈XFuture Processing
 
[FDD 2018] Jarosław Ogiegło - Ludzie, zabezpieczajcie się! Wprowadzenie do OA...
[FDD 2018] Jarosław Ogiegło - Ludzie, zabezpieczajcie się! Wprowadzenie do OA...[FDD 2018] Jarosław Ogiegło - Ludzie, zabezpieczajcie się! Wprowadzenie do OA...
[FDD 2018] Jarosław Ogiegło - Ludzie, zabezpieczajcie się! Wprowadzenie do OA...Future Processing
 
[JuraSIC! Meetup] Mateusz Stasch - Monady w .NET
[JuraSIC! Meetup] Mateusz Stasch - Monady w .NET[JuraSIC! Meetup] Mateusz Stasch - Monady w .NET
[JuraSIC! Meetup] Mateusz Stasch - Monady w .NETFuture Processing
 
[QE 2018] Aleksandra Kornecka – Kognitywne podejście do testowania aplikacji ...
[QE 2018] Aleksandra Kornecka – Kognitywne podejście do testowania aplikacji ...[QE 2018] Aleksandra Kornecka – Kognitywne podejście do testowania aplikacji ...
[QE 2018] Aleksandra Kornecka – Kognitywne podejście do testowania aplikacji ...Future Processing
 
[QE 2018] Adam Stasiak – Nadchodzi React Native – czyli o testowaniu mobilnyc...
[QE 2018] Adam Stasiak – Nadchodzi React Native – czyli o testowaniu mobilnyc...[QE 2018] Adam Stasiak – Nadchodzi React Native – czyli o testowaniu mobilnyc...
[QE 2018] Adam Stasiak – Nadchodzi React Native – czyli o testowaniu mobilnyc...Future Processing
 
[QE 2018] Łukasz Gawron – Testing Batch and Streaming Spark Applications
[QE 2018] Łukasz Gawron – Testing Batch and Streaming Spark Applications[QE 2018] Łukasz Gawron – Testing Batch and Streaming Spark Applications
[QE 2018] Łukasz Gawron – Testing Batch and Streaming Spark ApplicationsFuture Processing
 
[QE 2018] Marek Puchalski – Web Application Security Test Automation
[QE 2018] Marek Puchalski – Web Application Security Test Automation[QE 2018] Marek Puchalski – Web Application Security Test Automation
[QE 2018] Marek Puchalski – Web Application Security Test AutomationFuture Processing
 
[QE 2018] Rob Lambert – How to Thrive as a Software Tester
[QE 2018] Rob Lambert – How to Thrive as a Software Tester[QE 2018] Rob Lambert – How to Thrive as a Software Tester
[QE 2018] Rob Lambert – How to Thrive as a Software TesterFuture Processing
 
[QE 2018] Paul Gerrard – Automating Assurance: Tools, Collaboration and DevOps
[QE 2018] Paul Gerrard – Automating Assurance: Tools, Collaboration and DevOps[QE 2018] Paul Gerrard – Automating Assurance: Tools, Collaboration and DevOps
[QE 2018] Paul Gerrard – Automating Assurance: Tools, Collaboration and DevOpsFuture Processing
 
[QE 2018] Arnika Hryszko – Testy, które tworzą się same (prawie)
[QE 2018] Arnika Hryszko – Testy, które tworzą się same (prawie)[QE 2018] Arnika Hryszko – Testy, które tworzą się same (prawie)
[QE 2018] Arnika Hryszko – Testy, które tworzą się same (prawie)Future Processing
 
[QE 2018] Przemysław Sech – Software Quality Assistance w 40 minut
[QE 2018] Przemysław Sech – Software Quality Assistance w 40 minut[QE 2018] Przemysław Sech – Software Quality Assistance w 40 minut
[QE 2018] Przemysław Sech – Software Quality Assistance w 40 minutFuture Processing
 

More from Future Processing (20)

DPTO_Inżynieria oprogramowania to proces uczenia się.pdf
DPTO_Inżynieria oprogramowania to proces uczenia się.pdfDPTO_Inżynieria oprogramowania to proces uczenia się.pdf
DPTO_Inżynieria oprogramowania to proces uczenia się.pdf
 
DPTO_QA w świecie wartości biznesowych.pdf
DPTO_QA w świecie wartości biznesowych.pdfDPTO_QA w świecie wartości biznesowych.pdf
DPTO_QA w świecie wartości biznesowych.pdf
 
DPTO_Hello_Clean_Architekture.pdf
DPTO_Hello_Clean_Architekture.pdfDPTO_Hello_Clean_Architekture.pdf
DPTO_Hello_Clean_Architekture.pdf
 
[Quality Meetup #20] Michał Górski - Continuous Deployment w chmurze
[Quality Meetup #20] Michał Górski - Continuous Deployment w chmurze[Quality Meetup #20] Michał Górski - Continuous Deployment w chmurze
[Quality Meetup #20] Michał Górski - Continuous Deployment w chmurze
 
[Quality Meetup #20] Dorota Tadych - Hyperion - wystarczy jeden shake
[Quality Meetup #20] Dorota Tadych - Hyperion - wystarczy jeden shake[Quality Meetup #20] Dorota Tadych - Hyperion - wystarczy jeden shake
[Quality Meetup #20] Dorota Tadych - Hyperion - wystarczy jeden shake
 
[Quality Meetup #19] Magdalena Drechsler-Nowak - Tester w pułapce myślenia
[Quality Meetup #19] Magdalena Drechsler-Nowak - Tester w pułapce myślenia[Quality Meetup #19] Magdalena Drechsler-Nowak - Tester w pułapce myślenia
[Quality Meetup #19] Magdalena Drechsler-Nowak - Tester w pułapce myślenia
 
[Quality Meetup #19] Adrian Gonciarz - Testerska ruletka
[Quality Meetup #19] Adrian Gonciarz - Testerska ruletka[Quality Meetup #19] Adrian Gonciarz - Testerska ruletka
[Quality Meetup #19] Adrian Gonciarz - Testerska ruletka
 
[FDD 2018] Ł. Turchan, A. Hulist, M. Duchnowski - CUDA - results over coffee ...
[FDD 2018] Ł. Turchan, A. Hulist, M. Duchnowski - CUDA - results over coffee ...[FDD 2018] Ł. Turchan, A. Hulist, M. Duchnowski - CUDA - results over coffee ...
[FDD 2018] Ł. Turchan, A. Hulist, M. Duchnowski - CUDA - results over coffee ...
 
[FDD 2018] Lech Kalinowski - Prywatny Blockchain
[FDD 2018] Lech Kalinowski - Prywatny Blockchain[FDD 2018] Lech Kalinowski - Prywatny Blockchain
[FDD 2018] Lech Kalinowski - Prywatny Blockchain
 
[FDD 2018] W. Malara, K. Kotowski - Autoenkodery – czyli zalety funkcji F(X)≈X
[FDD 2018] W. Malara, K. Kotowski - Autoenkodery – czyli zalety funkcji F(X)≈X[FDD 2018] W. Malara, K. Kotowski - Autoenkodery – czyli zalety funkcji F(X)≈X
[FDD 2018] W. Malara, K. Kotowski - Autoenkodery – czyli zalety funkcji F(X)≈X
 
[FDD 2018] Jarosław Ogiegło - Ludzie, zabezpieczajcie się! Wprowadzenie do OA...
[FDD 2018] Jarosław Ogiegło - Ludzie, zabezpieczajcie się! Wprowadzenie do OA...[FDD 2018] Jarosław Ogiegło - Ludzie, zabezpieczajcie się! Wprowadzenie do OA...
[FDD 2018] Jarosław Ogiegło - Ludzie, zabezpieczajcie się! Wprowadzenie do OA...
 
[JuraSIC! Meetup] Mateusz Stasch - Monady w .NET
[JuraSIC! Meetup] Mateusz Stasch - Monady w .NET[JuraSIC! Meetup] Mateusz Stasch - Monady w .NET
[JuraSIC! Meetup] Mateusz Stasch - Monady w .NET
 
[QE 2018] Aleksandra Kornecka – Kognitywne podejście do testowania aplikacji ...
[QE 2018] Aleksandra Kornecka – Kognitywne podejście do testowania aplikacji ...[QE 2018] Aleksandra Kornecka – Kognitywne podejście do testowania aplikacji ...
[QE 2018] Aleksandra Kornecka – Kognitywne podejście do testowania aplikacji ...
 
[QE 2018] Adam Stasiak – Nadchodzi React Native – czyli o testowaniu mobilnyc...
[QE 2018] Adam Stasiak – Nadchodzi React Native – czyli o testowaniu mobilnyc...[QE 2018] Adam Stasiak – Nadchodzi React Native – czyli o testowaniu mobilnyc...
[QE 2018] Adam Stasiak – Nadchodzi React Native – czyli o testowaniu mobilnyc...
 
[QE 2018] Łukasz Gawron – Testing Batch and Streaming Spark Applications
[QE 2018] Łukasz Gawron – Testing Batch and Streaming Spark Applications[QE 2018] Łukasz Gawron – Testing Batch and Streaming Spark Applications
[QE 2018] Łukasz Gawron – Testing Batch and Streaming Spark Applications
 
[QE 2018] Marek Puchalski – Web Application Security Test Automation
[QE 2018] Marek Puchalski – Web Application Security Test Automation[QE 2018] Marek Puchalski – Web Application Security Test Automation
[QE 2018] Marek Puchalski – Web Application Security Test Automation
 
[QE 2018] Rob Lambert – How to Thrive as a Software Tester
[QE 2018] Rob Lambert – How to Thrive as a Software Tester[QE 2018] Rob Lambert – How to Thrive as a Software Tester
[QE 2018] Rob Lambert – How to Thrive as a Software Tester
 
[QE 2018] Paul Gerrard – Automating Assurance: Tools, Collaboration and DevOps
[QE 2018] Paul Gerrard – Automating Assurance: Tools, Collaboration and DevOps[QE 2018] Paul Gerrard – Automating Assurance: Tools, Collaboration and DevOps
[QE 2018] Paul Gerrard – Automating Assurance: Tools, Collaboration and DevOps
 
[QE 2018] Arnika Hryszko – Testy, które tworzą się same (prawie)
[QE 2018] Arnika Hryszko – Testy, które tworzą się same (prawie)[QE 2018] Arnika Hryszko – Testy, które tworzą się same (prawie)
[QE 2018] Arnika Hryszko – Testy, które tworzą się same (prawie)
 
[QE 2018] Przemysław Sech – Software Quality Assistance w 40 minut
[QE 2018] Przemysław Sech – Software Quality Assistance w 40 minut[QE 2018] Przemysław Sech – Software Quality Assistance w 40 minut
[QE 2018] Przemysław Sech – Software Quality Assistance w 40 minut
 

[JuraSIC! Meetup] Krzysztof Sikora- Jak Service Fabric rozwiąże twoje problemy z mikroserwisami?

  • 1.
  • 2. Monolit Mikroserwisy JEDNO NARZĘDZIE, KTÓRE ROZWIĄŻE TWOJE PROBLEMY Z MIKROSERWISAMI ZOBACZ MEMY >> źródło obrazka: https://thenounproject.com/term/poop/43299/
  • 3. Jedno narzędzie, które rozwiąże twoje problemy z mikroserwisami I DOSTARCZY NOWYCH źródło: pixabay.com
  • 4. Krzysztof „Jakub” Sikora  Programuję w chmurze  Prelegent / szkoleniowiec  dostarczajwartość.pl / gruba.it
  • 5. Dlaczego mikroserwisy mogą boleć? źródło: https://pl.pinterest.com/pin/169940585924496451/
  • 9. Żeby tak mieć narzędzie, które pasuje do mikroserwisów
  • 10. Service Fabric – “Microservices SDK”
  • 11.
  • 17. Skąd się bierze problem? źródło: pixabay.com
  • 18. Jako programiści sami musimy o wszystko zadbać źródło: pixabay.com
  • 20. Męczymy się i tracimy czas, zamiast skupić się na prawdziwym problemie źródło:
  • 21. Jak Service Fabric rozwiązuje problem komunikacyjne? źródło: buildazure.com
  • 22. var myServicePartitionClient = new ServicePartitionClient<MyCommunicationClient>( _myCommunicationClientFactory, "fabric:/MyApp/MyService", myPartitionKey); var result = await myServicePartitionClient.InvokeWithRetryAsync(async (client) => { // Communicate! }, CancellationToken.None);
  • 23. IMyService myService = ServiceProxy.Create<IMyService>(new Uri("fabric:/MyApp/MyService")); await myService.HelloWorldAsync();
  • 24. Komunikacja w Service Fabric  Exception Handling  Konfigurowalny retry  Wygodne, gotowe i optymalne rozwiązanie dla wielu protokołów źródło: buildazure.com
  • 25. Jak tego użyć w praktyce? źródło: pixabay.com
  • 26. internal sealed class MyService : StatelessService, IMyService { public Supervisor(StatelessServiceContext context) : base(context) {} public async Task HelloWorldAsync() { //do something } protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners() { return new[] { new ServiceInstanceListener(CreateServiceRemotingListener) }; } protected override async Task RunAsync(CancellationToken cancellationToken) { while (true) { cancellationToken.ThrowIfCancellationRequested(); await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken); } } }
  • 27. internal sealed class MyService : StatelessService, IMyService { public Supervisor(StatelessServiceContext context) : base(context) {} public async Task HelloWorldAsync() { //do something } protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners() { return new[] { new ServiceInstanceListener(CreateServiceRemotingListener) }; } protected override async Task RunAsync(CancellationToken cancellationToken) { while (true) { cancellationToken.ThrowIfCancellationRequested(); await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken); } } }
  • 28. internal sealed class MyService : StatelessService, IMyService { public Supervisor(StatelessServiceContext context) : base(context) {} public async Task HelloWorldAsync() { //do something } protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners() { return new[] { new ServiceInstanceListener(CreateServiceRemotingListener) }; } protected override async Task RunAsync(CancellationToken cancellationToken) { while (true) { cancellationToken.ThrowIfCancellationRequested(); await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken); } } }
  • 29. internal sealed class MyService : StatelessService, IMyService { public Supervisor(StatelessServiceContext context) : base(context) {} public async Task HelloWorldAsync() { //do something } protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners() { return new[] { new ServiceInstanceListener(CreateServiceRemotingListener) }; } protected override async Task RunAsync(CancellationToken cancellationToken) { while (true) { cancellationToken.ThrowIfCancellationRequested(); await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken); } } }
  • 30. <?xml version="1.0" encoding="utf-8"?> <ServiceManifest Name="MyService" Version="1.0" xmlns="http://schemas.microsoft.com/2011/01/fabric" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <ServiceTypes> <StatelessServiceType ServiceTypeName="MyServiceType" /> </ServiceTypes> <CodePackage Name="Code" Version="1.0"> <EntryPoint> <ExeHost> <Program>MyService.exe</Program> </ExeHost> </EntryPoint> </CodePackage> <ConfigPackage Name="Config" Version="1.0" /> <Resources> <Endpoints> <Endpoint Name="WebServiceEndpoint" Protocol="http" Port="80" /> <Endpoint Name="OtherServiceEndpoint" Protocol="tcp" Port="8505" /> </Endpoints> </Resources> </ServiceManifest>
  • 31. <?xml version="1.0" encoding="utf-8"?> <ServiceManifest Name="MyService" Version="1.0" xmlns="http://schemas.microsoft.com/2011/01/fabric" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <ServiceTypes> <StatelessServiceType ServiceTypeName="MyServiceType" /> </ServiceTypes> <CodePackage Name="Code" Version="1.0"> <EntryPoint> <ExeHost> <Program>MyService.exe</Program> </ExeHost> </EntryPoint> </CodePackage> <ConfigPackage Name="Config" Version="1.0" /> <Resources> <Endpoints> <Endpoint Name="WebServiceEndpoint" Protocol="http" Port="80" /> <Endpoint Name="OtherServiceEndpoint" Protocol="tcp" Port="8505" /> </Endpoints> </Resources> </ServiceManifest>
  • 32. <?xml version="1.0" encoding="utf-8"?> <ServiceManifest Name="MyService" Version="1.0" xmlns="http://schemas.microsoft.com/2011/01/fabric" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <ServiceTypes> <StatelessServiceType ServiceTypeName="MyServiceType" /> </ServiceTypes> <CodePackage Name="Code" Version="1.0"> <EntryPoint> <ExeHost> <Program>MyService.exe</Program> </ExeHost> </EntryPoint> </CodePackage> <ConfigPackage Name="Config" Version="1.0" /> <Resources> <Endpoints> <Endpoint Name="WebServiceEndpoint" Protocol="http" Port="80" /> <Endpoint Name="OtherServiceEndpoint" Protocol="tcp" Port="8505" /> </Endpoints> </Resources> </ServiceManifest>
  • 33. <?xml version="1.0" encoding="utf-8"?> <ServiceManifest Name="MyService" Version="1.0" xmlns="http://schemas.microsoft.com/2011/01/fabric" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <ServiceTypes> <StatelessServiceType ServiceTypeName="MyServiceType" /> </ServiceTypes> <CodePackage Name="Code" Version="1.0"> <EntryPoint> <ExeHost> <Program>MyService.exe</Program> </ExeHost> </EntryPoint> </CodePackage> <ConfigPackage Name="Config" Version="1.0" /> <Resources> <Endpoints> <Endpoint Name="WebServiceEndpoint" Protocol="http" Port="80" /> <Endpoint Name="OtherServiceEndpoint" Protocol="tcp" Port="8505" /> </Endpoints> </Resources> </ServiceManifest>
  • 34. Co trzeba zrobić, żeby zacząć korzystać z komunikacji w SF?  [W przypadku SF Remoting] Nuget: Install-Package Microsoft.ServiceFabric.Services.Remoting  Dodanie listenera do klasy Service’u  Dodanie endpointa w konfiguracji źródło: pixabay.com
  • 35. Potem abstrakcja, DI i można używać źródło: pixabay.com
  • 37. Dlaczego tyle trwało znalezienie tego błędu w komunikacji? źródło: pixabay.com
  • 38. Dlaczego pomimo kiepskiej diagnostyki udało się go znaleźć? źródło: imgur.com
  • 39. ffffasfasfas Jacob, do you know what is the cause of this error?
  • 40.
  • 41.
  • 42.
  • 43. Jak Service Fabric chroni nas przed łzami? źródło: buildazure.com
  • 45.
  • 46.
  • 47.
  • 49.
  • 50.
  • 51. Jak to wykorzystać w projekcie? źródło: pixabay.com
  • 52. Service Fabric Explorer przychodzi od razu lokalnie i na innych środowiskach źródło: pixabay.com
  • 55. Czy to w ogóle działa? źródło: pixabay.com
  • 60. Jak zrobić cache w skalowalnych, bezstanowych serwisach? źródło: moneyinc.com
  • 62. Może Redis?  Drogi (4 środowiska)  Dodatkowa zależność  Trzeba poświecić czas na dodatkową integrację
  • 63. Inne rozwiązanie? STANOWE serwisy w Service Fabric źródło: buildazure.com
  • 64. Czym jest stanowy serwis?
  • 65.
  • 66.
  • 67. Jak oprócz zwykłego cache można je wykorzystać? źródło: pixabay.com
  • 68. Co dają stanowe serwisy w Service Fabric?  Bardzo szybkie  Brak dodatkowych zależności  Zintegrowane z ekosystemem źródło: pixabay.com
  • 69. Jak użyć tej wspaniałości? źródło: pixabay.com
  • 70.
  • 71. internal sealed class TestService : StatefulService, IMyService { private IReliableDictionary<string, string> _someCache; private const string CacheName = "SomeCache"; public Test(StatefulServiceContext context, IReliableDictionary<string, string> someCache) : base(context) { _someCache = someCache; } public async Task<string> GetValue(string key) {...} protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners() => new ServiceReplicaListener[0]; protected override async Task RunAsync(CancellationToken cancellationToken) { _someCache = await StateManager.GetOrAddAsync<IReliableDictionary<string, string>>(CacheName); while (true) { cancellationToken.ThrowIfCancellationRequested(); await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken); } } }
  • 72. internal sealed class TestService : StatefulService, IMyService { private IReliableDictionary<string, string> _someCache; private const string CacheName = "SomeCache"; public Test(StatefulServiceContext context, IReliableDictionary<string, string> someCache) : base(context) { _someCache = someCache; } public async Task<string> GetValue(string key) {...} protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners() => new ServiceReplicaListener[0]; protected override async Task RunAsync(CancellationToken cancellationToken) { _someCache = await StateManager.GetOrAddAsync<IReliableDictionary<string, string>>(CacheName); while (true) { cancellationToken.ThrowIfCancellationRequested(); await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken); } } }
  • 73. public async Task<string> GetValue(string key) { using (ITransaction transaction = StateManager.CreateTransaction()) { bool valueCached = await _someCache.ContainsKeyAsync(transaction, key); if (!valueCached) { return GetFromOldDb(key); } ConditionalValue<string> cachedValue = await _someCache.TryGetValueAsync(transaction, key); return cachedValue.HasValue ? GetFromOldDb(key) : cachedValue.Value; } }
  • 74. Jak się komunikować z serwisem? źródło: pixabay.com
  • 75. IMyService myService = ServiceProxy.Create<IMyService>(new Uri("fabric:/MyApp/MyService")); string value = await myService.GetValue("key"); Uzywając pierwszej z metod komunikacji w Service Fabric
  • 76. var myServicePartitionClient = new ServicePartitionClient<MyCommunicationClient>( _myCommunicationClientFactory, "fabric:/MyApp/MyService", myPartitionKey); var result = await myServicePartitionClient.InvokeWithRetryAsync(async (client) => { await client.GetValueAsync("key"); }, CancellationToken.None); Uzywając drugiej z metod komunikacji w Service Fabric
  • 77. var myServicePartitionClient = new ServicePartitionClient<MyCommunicationClient>( _myCommunicationClientFactory, "fabric:/MyApp/MyService", myPartitionKey); var result = await myServicePartitionClient.InvokeWithRetryAsync(async (client) => { await client.GetValueAsync("key"); }, CancellationToken.None); Uzywając drugiej z metod komunikacji w Service Fabric
  • 78. Architektura mikroserwisów sprawiała nam sporo problemów źródło: pixabay.com
  • 79. Service Fabric eliminuje wiele problemów i odpowiedzialności źródło: buildazure.com
  • 80. Po wypuszczeniu SF na produkcję  Mieliśmy czas na rozwijanie istniejącego systemu (i migracje starego)  Klient jest zadowolony i uważa że nie zmarnowaliśmy jego pieniądzy  Mamy o czym opowiadać na konferencjach i meetupach źródło: buildazure.com
  • 81. Jak zacząć nastepny projekt w Service Fabric?  Service Fabric SDK i rozszerzenie Azure doVS  Wybierz template, który Cię interesuje  Zacznij pisać – gotowy przykład u mnie na blogu źródło: buildazure.com