Think About Event Sourcing

在开始使用Event Sourcing 之前,可能有些问题得想清楚,这也是我现在准备做的事情:

  • 一个事件中哪些东西是必须要存储的?
  • 如何实现Event Store
  • 如何保证一个事件仅仅被处理一次
  • 重复play事件的时候,如何处理side effects
  • 如果出现了错误的事件怎么处理
  • 事件没有变化,但是处理事件所依赖的第三方接口等变化了怎么办
  • 遇到业务变化,原有的事件所包含的信息需要升级或者更改怎么办
  • 事件虽然没有变化,但是处理事件的业务逻辑发生了变化怎么办

使用Thrift构建微服务的设想

关于微服务是用HTTP(REST)还是RPC争论由来已久,综合来看,可能大家更倾向于使用REST方式,例如Spring Cloud这一套框架。大致是这些原因吧:

  • 简单,尤其适合同Web项目集成
  • 跨语言支持良好
  • 浏览器天然支持
  • 可以不用考虑防火墙什么的限制
    最近在项目中实践Spring Cloud的微服务架构已有一段时间,我们使用Spring Boot构建微服务,使用Feign来封装服务调用,使用React Native开发客户端应用,为了保证各个服务间的接口格式正确我们又引入了Spring Cloud Contract Test(契约测试),听着很高大上的概念,然而遇到的坑往往也是很多。
    一个就是在契约测试这一步。听着好像Spring Contract Test能解决我们的问题了,然而,不仅有我们的服务,还有外部系统的服务,不是所有的服务都能加上契约测试(通常包含关键服务),而且这玩意只支持Java了,换成别的框架写服务,就没法玩了,这与微服务宣称的可插拔可替换又背道而驰了。
    敏捷团队往往不去思考本质的问题,而是想通过限制做事方式来达到目的,这是我所发现的。举个例子,静态代码检查就是这样一种方式,通过checkstyle或者PMD之类的做法,一旦出错你的代码就无法通过CI,然而并没有什么鸟用,因为检查出的问题无非是少了空格,少了括号之类的问题,聪明的程序员格式化一下代码就好了。又如契约测试,其实我在思考这玩意到底中用不中用。不能说不中用吧,但是不一定是在被正确的使用。
    契约测试解决的问题无非是一个接口定义的问题,你定义的和我想要的不一样那就会出问题了;你如果改接口,我通过测试知道你是不是改坏了。这让我想起Apache Thrift这个RPC框架,可能天然就解决了这个问题了,为什么这么说?来看下Thrift使用的步骤:
  • 使用一种配置文件定义出接口
  • 生成指定语言服务端和客户端代码
  • 集成到相应的服务中
    第一步就是定义接口了,如果在微服务间使用Thrift通信,那么我们所有的接口都可以在Thrift的定义文件中找到,包括修改记录什么的,岂不是很方便就能看出差异?再者,修改接口之后重新生成了客户端和服务端代码,这样如果出现接口参数变化之类的改动,直接编译就可能检查出错误来,迫使你修改正确了。
    RPC方式的效率要高REST那么一点吧,如果在服务间使用RPC,在对外的API上保留RESTful,我觉得未尝不是一个好的做法。有机会想尝试下。

在macOS 10.12 Sierra上 使用SIMBL

最近在开发React Native的应用的时候,需要根据UX提供的Zepkin的设计图来实现用户界面,但如何对比自己实现的界面和美工实现的界面是否一致呢?刚开始是将Zepkin和模拟器调整到一样的大小之后,通过截图并在Photo Shop中建两个图层,再设置上面的图层的透明度,这样虽然能实现我想要的效果,然而太麻烦了。能不能直接设置某一个窗口的透明度?这样我就可以直接蒙上去对比了?
于是找到了Afloat,这个插件可以为应用程序增加几个菜单,其中就有设置透明度的选项。这个插件需要SIMBL的支持,于是尝试安装SIMBL。经过一番折腾,EasySIMBL貌似是不可用了,找到一个可用的替代品:mySIMBL
另外需要关闭SIP

  • Reboot the Mac and hold down Command + R keys simultaneously after you hear the startup chime, this will boot OS X into Recovery Mode
  • When the “OS X Utilities” screen appears, pull down the ‘Utilities’ menu at the top of the screen instead, and choose “Terminal”
  • Type the following command into the terminal then hit return:
    csrutil disable; reboot
  • You’ll see a message saying that System Integrity Protection has been disabled and the Mac needs to restart for changes to take effect, and the Mac will then reboot itself automatically, just let it boot up as normal

查看SIP状态

csrutil status
# System Integrity Protection status: disabled.

如果在Window的菜单中没有看到,那么重启一下试试把,并不是所有的APP都支持这个扩展的,可以拿Calander试试。
ss.png
参考文章:

  • https://github.com/norio-nomura/EasySIMBL/issues/26

于是我就可以把我的Zepkin设置为透明的,再蒙到模拟器上来对比我的实现和效果图是不是一致了。

Mac下编译FFmpeg

最近需要解码rtsp的H264码流,手动编译下ffmpeg吧,mac下各种问题,要是linux估计就方便多了....本来准备参考https://evermeet.cx/ffmpeg/中的config来配置,但是很多依赖项,大部分都可以brew安装:

# yasm/nasm not found or too old.
brew install yasm
# libass not found using pkg-config
brew install libass
# libbluray not found using pkg-config
brew install libass
# libgsm not found
brew install libgsm
# libmodplug not found using pkg-config
brew install libmodplug
# libopencore_amrnb not found
brew install opencore-amr
# snappy not found
brew install snappy
# libsoxr not found
brew install libsoxr
# speex not found using pkg-config
brew install speex
# libtheora not found
brew install theora
# libmp3lame >= 3.98.3 not found
# vidstab not found using pkg-config
brew install libvidstab
# libvo_amrwbenc not found
# 这个咋安装?https://github.com/mstorsjo/vo-amrwbenc

各种路径找不到,如果强行指定则可以:

./configure --cc=/usr/bin/clang --prefix=/opt/ffmpeg --extra-version=tessus --enable-avisynth --enable-fontconfig --enable-gpl --enable-libass --enable-libbluray --enable-libfreetype --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopus --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzmq --enable-libzvbi --enable-version3 --disable-ffplay --disable-indev=qtkit \
--extra-ldflags="-L/usr/local/Cellar/libgsm/1.0.13/lib -L/usr/local/Cellar/lame/3.99.5/lib -L/usr/local/Cellar/opencore-amr/0.1.5/lib -L/usr/local/Cellar/snappy/1.1.6/lib -L/usr/local/Cellar/libsoxr/0.1.2/lib -L/usr/local/Cellar/speex/1.2.0/lib -L/usr/local/Cellar/theora/1.1.1/lib -L/usr/local/Cellar/libogg/1.3.2/lib -L/usr/local/Cellar/libvidstab/1.1.0/lib" \
--extra-cflags="-I/usr/local/Cellar/libgsm/1.0.13/include -I/usr/local/Cellar/lame/3.99.5/include -I/usr/local/Cellar/opencore-amr/0.1.5/include -I/usr/local/Cellar/snappy/1.1.6/include -I/usr/local/Cellar/libsoxr/0.1.2/include -I/usr/local/Cellar/speex/1.2.0/include -I/usr/local/Cellar/theora/1.1.1/include -I/usr/local/Cellar/libogg/1.3.2/include -I/usr/local/Cellar/libvidstab/1.1.0/include"

不过最后我还是放弃了,因为不知道怎么安装libvo_amrwbenc,(readme里面啥都没写),觉得折腾人,不就为了解码一下H264么,于是;

sudo -s
./configure --enable-gpl --enable-libx264
make && make install

如果出现奇怪的C compiler test failed.这个问题...需要切换到root权限编译
以后有时间再来尝试下上面的选项吧。
参考:

  • https://trac.ffmpeg.org/wiki/How%20to%20quickly%20compile%20FFmpeg%20with%20libx264%20(x264%2C%20H.264)