1.说下你可能没用过的收源EventBus
2.Action<SmsData> addData = d => SmsService.AddData(d); å¦ä½ç解ï¼
3.开源数据质量解决方案 Apache Griffin - 安装篇
说下你可能没用过的EventBus
最近在Code Review过程中,我发现了一个业务场景:业务处理完成后,码短码源码需要通知审核人员,信接通知方式包括短信和邮件。收源代码如下:
这个方法对吗?
针对这种常见的码短码源码业务场景,我们首先会考虑同步或异步发送的信接php 留言源码问题。
如果选择同步,收源会对接口的码短码源码响应时间产生影响,并且与业务逻辑紧密耦合,信接这显然不是收源好的做法。
一般情况下,码短码源码我们会选择异步方式,信接使用消息队列(MQ)进行消息的收源发送和消费,或者使用线程池来处理,码短码源码这样不会影响主业务逻辑,信接可以提高性能,并且实现了解耦。
此外,我们还需要考虑数据一致性的问题,邮件是否一定要发送成功?
大多数情况下,我们并不要求邮件必须%发送成功,引爆指标公式源码失败了就失败了,只要监控告警的失败率不超过阈值即可。同时,消息服务一旦收到请求,应该自行保证消息的投递。
因此,总的来说,使用MQ发送消息并自行处理,或者使用线程池进行异步处理,最后自行处理补偿逻辑,就能解决这类问题。
那么,今天要介绍的是这两种解决方案之外的处理方式。对于这种场景,我们可以使用EventBus来解决。
EventBus是事件总线的意思,它是Google Guava库的一个工具,基于观察者模式,可以在进程内实现代码的解耦。
以上面的门窗设计软件源码例子来说,引入MQ可能会有些过于复杂,其实使用EventBus也能达到相同的效果。与MQ相比,EventBus只能提供进程内的消息事件传递,但对于我们的业务场景来说,这已经足够了。
接下来,我们来看一下EventBus的使用方法。首先,创建一个EventBus实例。
第二步,创建一个事件消息订阅者,处理方式非常简单,只需在希望处理事件的方法上添加@Subscribe注解即可。
形参只能有一个,如果定义0个或多个,运行时将会报错。
第三步,注册事件。
第四步,短视频抓取源码发送事件。
这就是EventBus使用的最简单例子。下面我们看看如何结合开头的例子进行处理。
比如上面提到的案例,比如注册和用户下单的场景,都需要发送消息和邮件给用户。
EventBus并不强制要求我们使用单例模式,因为其创建和销毁成本较低,所以更多是根据我们的业务场景和上下文来选择。
在业务逻辑处理完成后,分别注册了邮件和短信两个事件订阅者。
最后,我们发送事件,用户注册时发送一个用户ID,下单成功时发送一个订单ID。
然后写一个测试类进行测试,分别创建两个service,然后分别调用方法。
执行测试类,我们可以看到输出,怎么放指标源码分别执行了事件订阅的方法。
使用起来你会发现非常简单,对于希望轻量级简单地实现解耦,使用EventBus非常合适。
注意,例子中的参数都是Long类型。如果事件的参数是其他类型,那么消息是无法接收到的。比如,如果我们将下单中发送的订单ID改为String类型,会发现没有消费。因为我们没有定义一个参数类型为String的方法。
去EmailMsgHandler和SmsMsgHandler都新增一个接收String类型的订阅方法,这样就可以接收到了。
除此之外,我们还可以定义一个DeadEvent来处理这种情况,它相当于是一个默认的处理方式。当没有匹配的事件类型参数时,就会默认发送一个DeadEvent事件。
定义一个默认处理器。
给BookingService新增一个pay()支付方法,下单完成后去支付,注册我们的默认事件。
执行测试bookingService.pay(),看到输出结果:
OK,简单的介绍就到这里。到目前为止,我们所说的都是同步调用,这并不符合我们的要求。我们当然希望使用异步处理更好。
那就看看源码它是如何实现的。
identifier是一个名字,标记,默认是default。
executor是执行器,默认创建一个MoreExecutors.directExecutor(),事件订阅者根据你提供的executor来决定如何执行事件订阅的处理方式。
exceptionHandler是异常处理器,默认创建的就是打点日志。
subscribers是我们的消费者,订阅者。
dispatcher用来做事件分发。
默认创建的executor是一个MoreExecutors.directExecutor(),看到command.run()你就会发现这其实是同步执行。
同步执行并不太好。我们希望不仅解耦,还要异步执行。EventBus提供了AsyncEventBus,我们可以自己传入executor。
上面的代码我们改成异步的,这样不就好起来了嘛。实际上,我们可以结合自己的线程池来处理。
OK,这个说清楚了。我们可以顺便再看看事件分发的处理。看到DeadEvent了吗?没有当前事件的订阅者,就会发送一个DeadEvent事件,bingo!
OK,这个使用和源码都比较简单,有兴趣的同学可以自己去看看,花不了多少功夫。
总的来说,EventBus提供了一个更优雅的代码解耦方式,你在实际工作中的业务中肯定能用得上它!
Action<SmsData> addData = d => SmsService.AddData(d); å¦ä½ç解ï¼
å æ解å¦ä¸ï¼
d => SmsService.AddData(d); //转æ¢ä¸
public void temp(SmsData d)
{
SmsService.AddData(d);
}
ä¸èè线ç¨å®å ¨ï¼å次翻è¯ï¼
Action<SmsData> addData = temp;
addData(obj);
public void temp(SmsData d)
{
SmsService.AddData(d);
}
çç¥äºä¸ä¸ªå½æ°ï¼ç¨Lamada表达å¼åç è¿ç§åæ³å¾é¿è§ åé¢ä½ å¨ç¼ç¨çæ¶åè½çå°ä¸å°
è¿ä¸ªæ¯ä¸ä¸ªå§æï¼å¨ä½¿ç¨ Action<T> å§ææ¶ï¼ä¸å¿ æ¾å¼å®ä¹ä¸ä¸ªå°è£ åªæä¸ä¸ªåæ°çæ¹æ³çå§æã
å®ä¹ï¼
public delegate void Action<in T>(T obj)//ç解ææ³åçã
DEMO:
using System;
using System.Windows.Forms;
public class TestAction1
{
public static void Main()
{
Action<string> messageTarget;
if (Environment.GetCommandLineArgs().Length > 1)
messageTarget = ShowWindowsMessage;
else
messageTarget = Console.WriteLine;
messageTarget("Hello, World!");
}
private static void ShowWindowsMessage(string message)
{
MessageBox.Show(message);
}
}
开源数据质量解决方案 Apache Griffin - 安装篇
本文将详细介绍如何安装开源数据质量解决方案Apache Griffin。首先,我们需要从GitHub获取源码,推荐使用分支griffin-0.2.0-incubating-rc4或tag=griffin-0.2.0-incubating。 安装前,请访问官方文档进行参考。尽管官方文档不够详细,且部分内容可能与实际代码不一致,但在安装前阅读代码将有助于理解安装过程。 安装流程如下: 安装代码模块前,确保已按照代码提示修改`env.json`文件。特别注意,将`mail`和`sms`配置从数组改为单个对象,尽管这两个配置在当前版本中未使用,可能为未来添加报警功能预留。 打包并编译成jar文件,命令如下:`mvn clean package`。确保在项目根目录执行此命令。 上传编译后的jar文件到HDFS。服务端配置与启动
安装并配置数据库服务。对于PostgreSQL和MySQL,分别执行`init_quartz.sql`文件以初始化quartz表。 调整配置文件,包括`sparkJob.properties`、`application.properties`等。具体配置如下: - `sparkJob.properties`中可能包括一些特定于Apache Griffin的配置项。 - `application.properties`中需要配置Hive元数据服务的地址,格式为`hive.metastore.uris = thrift://你的MetaStore地址:`。 启动服务,执行命令`java -jar service/target/service.jar`。前端UI配置与启动
运行`npm run start`以启动前端UI。 为了部署生产环境,运行`npm run build`以生成静态文件。将`dist`目录下的静态文件复制到Nginx或其他服务器上。部署测试
最后,访问部署的UI地址。页面成功打开后,配置测量和作业。如果系统运行正常,表示部署成功。 请确保在部署前阅读官方文档并参考代码以确保正确的安装和配置。安装过程可能需要根据实际环境进行调整。祝您安装成功!