当我们谈论采购事件时,我们有一个简单的双写架构,我们可以写入数据库,然后将事件写入队列,如 Kafka。其他下游系统可以读取这些事件并相应地对它们采取行动/使用它们。
但是当试图使数据库和事件同步时会出现问题,因为需要对这些事件进行排序才能使其有意义。
为了解决这个问题,人们鼓励使用数据库提交日志作为事件源,并且有围绕它构建的工具,例如 Airbnb 的 Spinal Tap、Redhat 的 Debezium、Oracle 的 Golden Gate 等……它解决了一致性、排序保证和所有这些。
但是使用数据库提交日志作为事件源的问题是我们与数据库模式紧密耦合。微服务的数据库架构是公开的,数据库架构中的任何破坏性更改,如数据类型更改或列名更改,实际上都可能破坏下游系统。
那么使用 DB CDC 作为事件源是个好主意吗?
我目前正在 Mac 上开发 Java 应用程序。我知道有来自 Apple 的密钥库,我想在该密钥库中安全地存储密码。
根据Apple开发人员的说法,我可以获得密钥库 keyStore = KeyStore.getInstance("KeychainStore", "Apple");
现在我的问题是:如何存储密码以及如何再次取回密码?我已经阅读了很多关于密钥库的内容,但我不知道实现会是什么样子。
以及如何从 Windows / Linux 获取内置密钥库?
我一直认为异步执行是为了高效的资源利用和线程安全,但是今天我遇到了Netty的奇怪行为。
public class Example {
public static void main(String[] args) throws Exception {
EventLoopGroup group = new NioEventLoopGroup();
ServerBootstrap bootstrap = new ServerBootstrap();
try {
bootstrap.group(group)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel channel) {
channel.pipeline()
.addLast(new ChannelOutboundHandlerAdapter() {
@Override
public void read(ChannelHandlerContext ctx) {
String id = String.valueOf(Thread.currentThread().getId());
ctx.writeAndFlush(Unpooled.wrappedBuffer(id.getBytes(StandardCharsets.UTF_8)))
.addListener(ChannelFutureListener.CLOSE);
}
});
}
})
.bind("localhost", 1234)
.sync()
.channel()
.closeFuture()
.syncUninterruptibly();
} finally {
group.shutdownGracefully()
.syncUninterruptibly();
}
}
}
Run Code Online (Sandbox Code Playgroud)
第一次连接的时候是16,然后是17、18、19等等,每次连接都是在一个新线程上执行的!为什么?如果 Netty 是多线程的,它有什么意义?