小编Chr*_*oph的帖子

无法使用 SSL 在 Kafka 中找出 inter.broker.listener.name 的设置

我正在尝试使用 SSL (TLS) 节点间以及节点和客户端之间配置 Kafka 节点,但遇到了配置问题。卡夫卡版本是 2.3.0。我的相关设置是:

      - KAFKA_BROKER_ID=1
      - ALLOW_PLAINTEXT_LISTENER=yes
      - KAFKA_LISTENERS=LISTENER_INTERNAL://kafka1:9092,LISTENER_EXTERNAL://kafka1:29092
      - KAFKA_ADVERTISED_LISTENERS=LISTENER_INTERNAL://kafka1:9092,LISTENER_EXTERNAL://localhost:29091
      - KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=LISTENER_INTERNAL:SSL,LISTENER_EXTERNAL:SSL
      - KAFKA_ZOOKEEPER_CONNECT=zookeeper1:2181,zookeeper2:2181,zookeeper3:2181
      - KAFKA_AUTO_CREATE_TOPICS_ENABLE=false
      - KAFKA_SSL_TRUSTSTORE_LOCATION=/var/private/ssl/server.truststore.jks
      - KAFKA_SSL_TRUSTSTORE_PASSWORD=changeit
      - KAFKA_SSL_KEYSTORE_LOCATION=/var/private/ssl/server.keystore.jks
      - KAFKA_SSL_KEYSTORE_PASSWORD=changeit
      - KAFKA_SSL_KEY_PASSWORD=changeit
      - KAFKA_SECURITY_INTER_BROKER_PROTOCOL=SSL
      - KAFKA_SSL_CLIENT_AUTH=required
Run Code Online (Sandbox Code Playgroud)

仅供参考,为简单起见,我从实例化 Kafka 容器的 docker-compose 文件中复制了设置。环境变量 1:1 映射到 server.properties 中的属性。在容器启动期间,这些设置将应用于 server.properties 文件。

当我开始使用此配置时,我收到以下错误消息:

java.lang.IllegalArgumentException:要求失败:inter.broker.listener.name 必须是advertised.listeners 中定义的侦听器名称。基于当前配置的监听器的有效选项是 LISTENER_INTERNAL,LISTENER_EXTERNAL

当我将inter.broker.listener.name属性设置为INTERNAL_LISTENERSSLnull或空字符串时,我收到以下错误消息:

org.apache.kafka.common.config.ConfigException:只应设置 inter.broker.listener.name 和 security.inter.broker.protocol 之一。

我在这个问题上花了几个小时。我将我的设置与网上那些应该用 SSL 配置演示 Kafka 的几个例子进行了比较。

任何的想法?

ssl apache-kafka

10
推荐指数
1
解决办法
7009
查看次数

ICorProfilerCallback2:CLR 分析器不会记录所有离开调用

我正在尝试编写一个分析器来记录进程中的所有 .Net 方法调用。目标是使其具有高性能,并将最后 5-10 分钟保留在内存中(固定缓冲区,循环覆盖旧信息),直到用户触发将该信息写入磁盘。预期用途是追踪很少重现的性能问题。

我从https://github.com/appneta/SimpleCLRProfiler的 SimpleCLRProfiler 项目开始。探查器利用.Net 探查的ICorProfilerCallback2回调接口。我让它在我的环境(Win 8.1、.Net 4.5、VS2012)中编译和工作。但是,我注意到有时会丢失记录了 Enter 呼叫的 Leave 呼叫。Console.WriteLine 调用的示例(我将 DbgView 的输出减少到理解所需的最低限度):

Line 1481: Entering System.Console.WriteLine
Line 1483: Entering SyncTextWriter.WriteLine
Line 1485: Entering System.IO.TextWriter.WriteLine
Line 1537: Leaving SyncTextWriter.WriteLine
Run Code Online (Sandbox Code Playgroud)

两个 Entering 呼叫没有对应的 Leaveing 呼叫。分析后的 .Net 代码如下所示:

Console.WriteLine("Hello, Simple Profiler!");
Run Code Online (Sandbox Code Playgroud)

相关的 SimpleCLRProfiler 方法是:

HRESULT CSimpleProfiler::registerGlobalCallbacks() 
{
   HRESULT hr = profilerInfo3->SetEnterLeaveFunctionHooks3WithInfo(
      (FunctionEnter3WithInfo*)MethodEntered3, 
      (FunctionEnter3WithInfo*)MethodLeft3, 
      (FunctionEnter3WithInfo*)MethodTailcall3);

   if (FAILED(hr))
      Trace_f(L"Failed to register global callbacks (%s)", _com_error(hr).ErrorMessage());

   return S_OK;
}

void CSimpleProfiler::OnEnterWithInfo(FunctionID functionId, COR_PRF_ELT_INFO eltInfo)
{
    MethodInfo info; …
Run Code Online (Sandbox Code Playgroud)

.net c# windows performance clr-profiling-api

5
推荐指数
1
解决办法
474
查看次数

仅在 Aurora 事务提交时调用 Lambda 函数,但保证调用(ACID)

对于新项目中的一个微服务,我目前正在考虑是使用DynamoDB还是Aurora MySQL作为底层数据存储。微服务为用户界面提供了 REST API,并且还会有其他几个微服务。那些其他微服务应该侦听由 UI 连接服务生成的事件流(事件源),以保持其他读取模型同步。

我试图找出一种方法来保证发布到更改事件流的事件与底层数据存储中的数据更改完全匹配。通常,担心的是,如果 REST API 处理程序(例如)在执行过程中被中断,它可能已经更改了数据但尚未创建事件(假设更改事件在数据更改后发布)。我现在正在寻找可以减轻这种担忧的机制。

对于 DynamoDB,有 DynamoDB 流和 AWS Lambda 触发器可以对数据存储级别的数据更改做出反应。触发的 Lambda 可以将低级数据更改转换为有意义的更改事件,然后将事件发布到 SNS、SQS 或 Kinesis。

对于 Aurora MySQL,我还没有想出这样的机制。我看过描述两种机制的文章:

  1. 为 Aurora 启用二进制日志并使用额外的 EC2 实例来处理更改流。从此流中发布其他服务的事件。
  2. 使用本机 lambda_sync 或 lambda_async 函数从 MySQL 触发器调用 Lambda。从此 Lambda 中发布其他服务的事件。

一,我对这两种方法都不太满意:1) 我不想管理额外的 EC2 实例和处理原始 SQL 更改。2) 我打算为 Aurora 使用约束、乐观并发和事务,这意味着事务可以并且将会失败和回滚。但是,无论事务结果如何,都将执行 lambda_(a)sync 调用。

对 Aurora 有什么更好的想法吗?还是我从错误的角度看待这个问题?

我想将这个问题和讨论集中在如何保证底层数据存储和具有更改事件的传出流之间的更改一致性的问题上,而不是在 Aurora 与 DynamoDB 上。

amazon-web-services microservices amazon-aurora

5
推荐指数
1
解决办法
1016
查看次数