我有一个要求,我需要从一组阻塞队列中读取.阻塞队列由我正在使用的库创建.我的代码必须从队列中读取.我不想为每个阻塞队列创建一个读者线程.相反,我想使用单个线程(或者可能最多使用2/3线程)轮询它们的数据可用性.由于某些阻塞队列可能长时间没有数据,而其中一些阻塞队列可能会获得数据突发.轮询具有较小超时的队列将起作用,但这根本不高效,因为它仍然需要在所有队列上保持循环,即使其中一些队列长时间没有数据.基本上,我正在寻找一个选择/ epoll(用于套接字)类型的阻塞队列机制.任何线索都非常感谢.
尽管如此,在Go中执行此操作非常简单.下面的代码模拟了与channel和goroutines相同的内容:
package main
import "fmt"
import "time"
import "math/rand"
func sendMessage(sc chan string) {
var i int
for {
i = rand.Intn(10)
for ; i >= 0 ; i-- {
sc <- fmt.Sprintf("Order number %d",rand.Intn(100))
}
i = 1000 + rand.Intn(32000);
time.Sleep(time.Duration(i) * time.Millisecond)
}
}
func sendNum(c chan int) {
var i int
for {
i = rand.Intn(16);
for ; i >= 0; i-- {
time.Sleep(20 * time.Millisecond)
c <- rand.Intn(65534)
}
i = 1000 + rand.Intn(24000); …Run Code Online (Sandbox Code Playgroud) 我正在使用Logback进行日志记录.Scribe appender将日志实时发送到中央Scribe聚合器.但我不知道如何在日志中为每个日志事件添加源机器IP.查看聚合的中央Scribe日志,几乎不可能知道哪台计算机正在发送日志.因此,将源计算机的IP附加到每个日志事件将会很有帮助,如果我们可以通过logback配置来控制它,那将非常好.
我开始使用 docker 并喜欢它主要是因为 Docker 容器是一种轻量级虚拟机。但我无法弄清楚,docker 容器如何解析彼此的主机名。他们可以使用 IP 地址相互连接,但不能使用主机名,我什至无法编辑容器中的 /etc/hosts 来弥补这一点。当我重新启动容器时,它们会获得不同的 IP,因此我想使用主机名代替 IP 来相互通信。假设我想在容器中运行 Zookeeper 集群的 Zookeeper 实例,并且想将 Zookeeper 服务器的主机名放入配置 (zoo.cfg) 文件中。
我试图检查Go将如何使用100,000 goroutines.我写了一个简单的程序来产生许多例程,除了打印一些公告之外什么都不做.我将MaxStack大小限制为仅512字节.但我注意到程序大小并没有减少.它消耗了大约460 MB的内存,因此每个goroutine大约4 KB.我的问题是,我们可以设置最大堆栈大小低于goroutines的"最小"堆栈大小(可能是4 KB).我们如何设置Goroutine开始的最小堆栈大小?以下是我用于测试的示例代码:
package main
import "fmt"
import "time"
import "runtime/debug"
func main() {
fmt.Printf("%v\n", debug.SetMaxStack(512))
var i int
for i = 0; i < 100000; i++ {
go func(x int) {
for {
time.Sleep(10 * time.Millisecond)
//fmt.Printf("I am %v\n", x)
}
}(i)
}
fmt.Println("Done")
time.Sleep(999999999999)
}
Run Code Online (Sandbox Code Playgroud) 我们如何确保只有一个进程会收到某些 Mongo 集合更改通知?我们运行几个进程来继续侦听某些集合中的更改。但他们所有人都会收到所有更改通知。我们可以使用一些外部锁来解决这个问题,即无论哪个进程获得锁,都只会订阅更改通知,如果锁所有者进程死亡/释放锁,那么其他进程可能会获得锁并开始监听更改通知。
但是有什么方法可以从 Mongo 驱动程序本身实现这一点吗?我正在寻找像 Kafka 消费者组这样的东西,可以保证在消费者组中,只有一个消费者从分区获取事件。
假设一个集合,其架构如下所示:
{
"customer" : <unique-id-for-customer>,
"purchase" : <number>,
}
Run Code Online (Sandbox Code Playgroud)
现在,我希望获得前五名客户(按购买排名),第六名是"其他",它结合了其他客户的所有购买数量.
基本上,聚合的输出应该是:
{ "_id" : "customer100", "purchasequantity" : 4000000 }
{ "_id" : "customer5", "purchasequantity" : 81800 }
{ "_id" : "customer4", "purchasequantity" : 40900 }
{ "_id" : "customer3", "purchasequantity" : 440 }
{ "_id" : "customer1", "purchasequantity" : 300 }
{"_id" : "others", "purchasequantity" : 29999}
Run Code Online (Sandbox Code Playgroud) 假设我们要收集一个月的相同指标,现在我们想修改这些指标以使其具有额外的标签(在旧数据中也是如此),我们该如何做。现有指标:
mongodb_exporter_last_scrape_duration_seconds{instance="127.0.0.1:9216",job="mongo"}
Run Code Online (Sandbox Code Playgroud)
想要将其更改为:
mongodb_exporter_last_scrape_duration_seconds{cluster="stage", instance="127.0.0.1:9216",job="mongo"}
Run Code Online (Sandbox Code Playgroud) 我对JSTACK无法获得进程的线程转储很无能为力.它是重新调整错误"java.lang.RuntimeException:无法从地址中推断出线程的类型......"
我试过下面的命令:
$ sudo bin/jstack 42846
$ sudo bin/jstack -F 42846
Run Code Online (Sandbox Code Playgroud)
任何线索都会对我有所帮助.以下是我遇到的错误:
Attaching to process ID 42846, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.131-b11
Deadlock Detection:
java.lang.RuntimeException: Unable to deduce type of thread from address 0x00007fb1f430f000 (expected type JavaThread, CompilerThread, ServiceThread, JvmtiAgentThread, or SurrogateLockerThread)
at sun.jvm.hotspot.runtime.Threads.createJavaThreadWrapper(Threads.java:166)
at sun.jvm.hotspot.runtime.Threads.first(Threads.java:150)
at sun.jvm.hotspot.runtime.DeadlockDetector.createThreadTable(DeadlockDetector.java:149)
at sun.jvm.hotspot.runtime.DeadlockDetector.print(DeadlockDetector.java:56)
at sun.jvm.hotspot.runtime.DeadlockDetector.print(DeadlockDetector.java:39)
at sun.jvm.hotspot.tools.StackTrace.run(StackTrace.java:62)
at sun.jvm.hotspot.tools.StackTrace.run(StackTrace.java:45)
at sun.jvm.hotspot.tools.JStack.run(JStack.java:66)
at sun.jvm.hotspot.tools.Tool.startInternal(Tool.java:260)
at sun.jvm.hotspot.tools.Tool.start(Tool.java:223)
at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
at sun.jvm.hotspot.tools.JStack.main(JStack.java:92)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) …Run Code Online (Sandbox Code Playgroud) 我正在学习Clojure并使用Clojure 1.5.1.似乎Clojure 1.5.1不再具有defnk宏.那么,在Clojure 1.5.1中,defnk的等价物是什么?
我正在尝试一些Clojure,但现在对"conj"的行为感到困惑.见下面的exaples:
user=> (conj [1 2 3] 4)
[1 2 3 4]
Run Code Online (Sandbox Code Playgroud)
以上是预期的.但现在,如果我这样做:
user=> (conj (reverse [1 2 3]) 4)
(4 3 2 1)
Run Code Online (Sandbox Code Playgroud)
它返回(4 3 2 1).但我想它本应该回来了(3 2 1 4).那么,我在这里错过了什么?
对于具有高可用性的 MongoDB、Cassandra 或 Elasticsearch 集群的数据库目录,我应该使用 EBS 还是 EFS?如果 MongoDB、Cassnadra 和 Elasticsearch 集群配置为复制因子 > 1,它们会负责跨节点复制数据,因此我猜可能不需要 EFS 复制功能。
amazon-ec2 amazon-ebs mongodb amazon-web-services amazon-efs
我是prometheus的新手,所以我不确定高可用性是否是Prometheus数据存储tsdb的一部分.我没有考虑让两个prometheus服务器实例从同一个导出器中抓取数据,因为它很可能有两个不同步的tsdb数据存储.
我在Cassandra有一个表,我用1000个条目填充一些行(每行有10000+列).行中的条目经常更新,基本上只是一个字段(它是一个整数)用不同的值更新.列的所有其他值保持不变.我的问题是,更新是否会就地完成?Cassandra频繁更新参赛作品有多好?
mongodb ×3
clojure ×2
go ×2
java ×2
prometheus ×2
amazon-ebs ×1
amazon-ec2 ×1
amazon-efs ×1
cassandra ×1
concurrency ×1
docker ×1
dockerhub ×1
java-8 ×1
logback ×1
nosql ×1
pymongo ×1