微服务核心模式:一消息两服务

需积分: 7 2 下载量 133 浏览量 更新于2024-07-17 收藏 17.18MB PDF 举报
"《The Tao of Microservices》第一版,由Manning出版社于2017年12月发行,提供了英文PDF版本,适合阅读和做笔记。此书已去除只读模式,并重新安排了页码,便于在不同服务之间进行跳转。标签涉及微服务架构、扩展性和设计原则。书中部分内容探讨了核心消息模式,包括一对一消息服务和一对多消息服务。" 《The Tao of Microservices》是关于微服务架构的一本深入指南,旨在帮助读者理解和实践微服务设计的核心原则。书中的核心消息模式是理解微服务间通信的关键。 首先,一对一消息服务(Synchronous/Consumed)模式类似于HTTP请求/响应模型。在这种模式下,发送方微服务期望立即收到响应,且消息被消费,意味着只有一个接收方微服务会生成响应。这种通信方式确保了点对点的同步交互。例如,当微服务A发送一个命令消息到微服务B时,它期待至少有一个即时响应,而微服务B则处理这个命令并返回结果。 其次,一对多消息服务(Synchronous/Observed)模式中,消息是被观察的,而不是被消耗。这意味着不是所有接收者都会生成响应,而是其中一部分。这种模式通常用于需要多个微服务协作的情况,如生成多个推荐。例如,微服务A可能发布一个请求,多个微服务B可以观察到该请求并各自生成一个推荐响应。消息的分发机制由消息层抽象处理,以便解耦具体实现。 书中通过具体的例子和图示,如微服务A和微服务B之间的实线表示同步通信,空箭头表示被观察等,清晰地展示了这些模式如何在实际微服务架构中运作。这些模式对于理解微服务间的协作和数据流至关重要,有助于设计出可扩展、高可用的微服务系统。作者通过深入的分析和案例,为读者提供了构建微服务架构的实用指导和理论依据。

% eta数据 % 输入:24个激光干涉数据 % 输出:6列eta数据 function [eta,etatstart,etaNpoints]=etadata(t0,sci,scib,tao,epsilon) global Fs M m1 m2 m3 m4 m5 m6; Npoints=length(sci(:,1)); prePoints=10*Fs+2*M; endPoints=2*M; etaNpoints=Npoints-prePoints-endPoints; etatstart=t0+prePoints/Fs; eta=zeros(etaNpoints,12); epsilon1=epsilon(:,1);epsilon2=epsilon(:,2);epsilon3=epsilon(:,3); epsilon4=epsilon(:,4);epsilon5=epsilon(:,5);epsilon6=epsilon(:,6); tao1=tao(:,1);tao2=tao(:,2);tao3=tao(:,3); tao4=tao(:,4);tao5=tao(:,5);tao6=tao(:,6); for ii=prePoints+1:prePoints+etaNpoints ti=t0+(ii-1)/Fs; Ltime=lasertravelTime(ti,0); delay0=Ltime(1:6)*Fs; delay0M=ceil(delay0); delay0e=delay0M-delay0; doppler0=1-Ltime(7:12); d3epsilon5tao5=epsilon5(ii-delay0M(3)+M:-1:ii-delay0M(3)-M+1)-tao5(ii-delay0M(3)+M:-1:ii-delay0M(3)-M+1); d1epsilon6tao6=epsilon6(ii-delay0M(1)+M:-1:ii-delay0M(1)-M+1)-tao6(ii-delay0M(1)+M:-1:ii-delay0M(1)-M+1); d2epsilon4tao4=epsilon4(ii-delay0M(2)+M:-1:ii-delay0M(2)-M+1)-tao4(ii-delay0M(2)+M:-1:ii-delay0M(2)-M+1); d5epsilon3tao3=epsilon3(ii-delay0M(5)+M:-1:ii-delay0M(5)-M+1)-tao3(ii-delay0M(5)+M:-1:ii-delay0M(5)-M+1); d6epsilon1tao1=epsilon1(ii-delay0M(6)+M:-1:ii-delay0M(6)-M+1)-tao1(ii-delay0M(6)+M:-1:ii-delay0M(6)-M+1); d4epsilon2tao2=epsilon2(ii-delay0M(4)+M:-1:ii-delay0M(4)-M+1)-tao2(ii-delay0M(4)+M:-1:ii-delay0M(4)-M+1); d3tao2tao5=tao2(ii-delay0M(3)+M:-1:ii-delay0M(3)-M+1)-tao5(ii-delay0M(3)+M:-1:ii-delay0M(3)-M+1); d1tao3tao6=tao3(ii-delay0M(1)+M:-1:ii-delay0M(1)-M+1)-tao6(ii-delay0M(1)+M:-1:ii-delay0M(1)-M+1); d2tao1tao4=tao1(ii-delay0M(2)+M:-1:ii-delay0M(2)-M+1)-tao4(ii-delay0M(2)+M:-1:ii-delay0M(2)-M+1); eta(ii-prePoints,1)=sci(ii,1)-(epsilon(ii,1)-tao(ii,1))/2-doppler0(3)*fracdelay(delay0e(3))*(d3epsilon5tao5+ d3tao2tao5)/2; eta(ii-prePoints,2)=sci(ii,2)-(epsilon(ii,2)-tao(ii,2))/2-doppler0(1)*fracdelay(delay0e(1))*(d1epsilon6tao6+ d1tao3tao6)/2; eta(ii-prePoints,3)=sci(ii,3)-(epsilon(ii,3)-tao(ii,3))/2-doppler0(2)*fracdelay(delay0e(2))*(d2epsilon4tao4+ d2tao1tao4)/2; eta(ii-prePoints,4)=sci(ii,4)-(epsilon(ii,4)-tao(ii,4))/2-doppler0(5)*fracdelay(delay0e(5))*d5epsilon3tao3/2+(tao(ii,1)-tao(ii,4))/2; eta(ii-prePoints,5)=sci(ii,5)-(epsilon(ii,5)-tao(ii,5))/2-doppler0(6)*fracdelay(delay0e(6))*d6epsilon1tao1/2+(tao(ii,2)-tao(ii,5))/2; eta(ii-prePoints,6)=sci(ii,6)-(epsilon(ii,6)-tao(ii,6))/2-doppler0(4)*fracdelay(delay0e(4))*d4epsilon2tao2/2+(tao(ii,3)-tao(ii,6))/2; eta(ii-prePoints,7)=(scib(ii,1)-sci(ii,1))/m5; eta(ii-prePoints,8)=(scib(ii,2)-sci(ii,2))/m6; eta(ii-prePoints,9)=(scib(ii,3)-sci(ii,3))/m4; eta(ii-prePoints,10)=(scib(ii,4)-sci(ii,4))/m3; eta(ii-prePoints,11)=(scib(ii,5)-sci(ii,5))/m1; eta(ii-prePoints,12)=(scib(ii,6)-sci(ii,6))/m2; end end

2023-05-25 上传

将下面代码写成matlab形式 int runBm3d( const Mat image_noisy, Mat& image_basic, Mat& image_denoised ) { int Height = image_noisy.rows; int Width = image_noisy.cols; int Channels = image_noisy.channels(); vector<Mat> block_noisy;//store the patch vector<int>row_idx;//patch idx along the row direction vector<int>col_idx; GetAllBlock(image_noisy, Width, Height, Channels, kHard, pHard, block_noisy, row_idx, col_idx); int bn_r = row_idx.size(); int bn_c = col_idx.size(); tran2d(block_noisy, kHard); vector<int> sim_num;//index number for the selected similar patch in the block vector vector<int> sim_idx_row;//index number for the selected similar patch in the original Mat vector<int> sim_idx_col; vector<Mat>data;//store the data during transforming and shrinking Mat kaiser = gen_kaiser(beta, kHard);//2-D kaiser window float weight_hd = 1.0;//weights used for current relevent patch Mat denominator_hd(image_noisy.size(), CV_32FC1, Scalar::all(0)); Mat numerator_hd(image_noisy.size(), CV_32FC1, Scalar::all(0)); for (int i = 0; i < bn_r; i++) { for (int j = 0; j < bn_c; j++) { //for each pack in the block sim_num.clear(); sim_idx_row.clear(); sim_idx_col.clear(); data.clear(); getSimilarPatch(block_noisy, data, sim_num, i, j, bn_r, bn_c, int((nHard - kHard) / pHard) + 1, NHard, tao_hard);//block matching for (int k = 0; k < sim_num.size(); k++)//calculate idx in the left-top corner { sim_idx_row.push_back(row_idx[sim_num[k] / bn_c]); sim_idx_col.push_back(col_idx[sim_num[k] % bn_c]); } tran1d(data, kHard);//3-D transforming DetectZero(data, lambda3d * sigma);//shrink the cofficient weight_hd = calculate_weight_hd(data, sigma); Inver3Dtrans(data,kHard);//3-D inverse transforming aggregation(numerator_hd, denominator_hd, sim_idx_row, sim_idx_col, data, weight_hd, kHard, kaiser);//aggregation using weigths } } image_basic = numerator_hd / denominator_hd;

2023-05-24 上传